2013-04-05 4 views
0

У меня есть папка с несколькими текстовыми файлами в том, что мне нужно обрабатывать и формат, используя несколько списков запасных выглядящие как это:несколько регулярных выражений замены на основе списков в нескольких файлах

old string1~new string1 
old string2~new string2 
etc~blah 

Я бегу каждую замену пары от замены списки в каждой строке этих текстовых файлов. Теперь у меня есть набор скриптов python для выполнения этой операции. Что мне интересно, будет ли он сделать код более простым и удобным, если я переключусь на sed или awk? Будет ли это лучшим решением или мне лучше улучшить код Python? Я прошу, потому что входящие текстовые файлы поступают регулярно и часто имеют немного другую структуру, чем раньше, например, ошибки, орфографические ошибки, несколько пробелов, поскольку эти файлы создаются людьми. Поэтому я должен постоянно настраивать списки кода и замены, чтобы он работал правильно. Спасибо.

+2

Трудно сказать, не видя ваш код на Python, поэтому у нас есть лучшая идея, если там есть бутылочная горка ... –

+0

Вы использовали слово «строка» в своем вопросе, но принятое вами решение использует вместо этого регулярные выражения, так что это на левая сторона «~» сверху - строки или регулярные выражения? –

+0

Да, я сожалею о путанице, я использую регулярные выражения, а те строки с ~ на самом деле являются регулярными выражениями. –

ответ

4

Если ваш код на Python действительно плохой, маловероятно, что переход на awk сделает его более удобным. Тем не менее, это довольно просто в AWK, но не очень хорошо масштабируется:

cat replacement-list-files* | awk 'FILENAME == "-" { 
    split($0, a, "~"); repl[ a[1] ] = a[2]; next } 
    { for(i in repl) gsub(i, repl[i]) }1' - input-file 

Обратите внимание, что это работает на один файл одновременно. Замените 1 чем-то наподобие { print > (FILENAME ".new") }, чтобы работать с несколькими файлами, но тогда вам нужно иметь дело с закрытием файлов, если вы хотите работать с большим количеством файлов, и это быстро становится бесполезным беспорядком. Stick с Python, если у вас уже есть рабочее решение.

+1

FYI Вам не нужно беспокоиться о закрытии файлов с помощью GNU awk независимо от того, на сколько вы работаете. –

0

Вот регулярная замена выражения сценария (в основном просто косметически отличается от того, что @WilliamPursell писал):

awk -F'~' ' 
    NR==FNR{ map[$1] = $2; next } 
    { 
     for (old in map) { 
     gsub(old,map[old] 
     } 
    } 
    ' /wherever/mappingFile file 

но вот сценарий замены строки, которые я думаю, что вам действительно нужно:

awk -F'~' ' 
    NR==FNR{ map[$1] = $2; next } 
    { 
     for (old in map) { 
     rlength = length(old) 
     while (rstart = index($0,old)) { 
      $0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength) 
     } 
     } 
    } 
    ' /wherever/mappingFile file 

В любой случай просто заключает его в цикл оболочки, чтобы воздействовать на несколько файлов:

for file in * 
do 
    awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file" 
done 
Смежные вопросы