9

У меня большой текстовый файл (около 2 ГБ). Я хочу выполнить пять операций поиска и замены одного и того же файла и хотел бы сделать это одной командой. Обычно я использую vim, открываю файл, выполняю одно действие замены, затем следующее и т.д. Есть одна ловушка, поскольку я заметил, что после трех или четырех поисков vim падает из-за проблем с памятью.

Вот два примера команды, которую я использую в Vim:

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

Каков наилучший способ справиться с этим?

2 ответа2

7

Я бы использовал sed, как это:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

Опция -i означает замену на месте. Вы можете указать sed создать резервную копию вашего файла с расширением этой опции ( -i.bak создаст резервную копию yourfile.txt как yourfile.txt.bak).

5

Если у вас есть еще много шаблонов поиска, вы можете сохранить их в файле и прочитать оттуда замены. Например, допустим, что это содержимое файла replacements.txt:

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

Затем вы можете прочитать список N замен и заменить их следующим:

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

ЗАМЕТКИ:

  • Это предполагает, что ваши строки поиска не содержат пробелов и любые странные символы должны быть экранированы в replacements.txt .
  • Он будет запускать один sed на замену, что может занять некоторое время, если у вас много операций по замене.
  • Он может иметь дело с произвольным числом замен (тысячи или миллионы или что-то еще), если вы не возражаете, что это займет немного больше времени.

Другим вариантом будет написать выше, как сценарий sed :

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

Затем вы можете запустить скрипт для вашего файла, и он сделает все замены за один раз:

sed -f replace.sed infile.txt 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .