Как я могу выполнить большое количество различных операций поиска / замены?

У меня несколько раз был текстовый документ, к которому мне нужно применить несколько сотен операций поиска / замены. Эти находки / замены не следуют шаблону, к которому может быть применено регулярное выражение, и должны применяться по порядку. Ранее после долгих поисков я прибегал к их выполнению вручную, но есть ли лучший способ?

3 ответа

Решение

Пожалуйста, поправьте меня, если я неправильно понял ваш вопрос, но из вашего описания я понимаю, что у вас есть одна (возможно, очень большая) Ascii .txt документ и что, когда вы говорите, что изменения должны быть применены "по порядку", вы имеете в виду, что вы хотите выполнить первый поиск / замену по всему документу, затем второй поиск / замену по всему документу и так далее.

Возможно, самым простым решением было бы создать файл (назовите его sedscript) содержащий sed сценарий, одна строка на изменение. Вот пример. g в конце означает "глобальный", т. е. заменяет все вхождения, а не только первое вхождение в любой заданной строке.

s/foo/bar/g
s/hello/world/g
s/yellow/green/g
:

Затем вы можете запустить это следующим образом:

sed -f sedscript infile.txt > outfile.txt

Если вы удовлетворены результатом, просто mv это обратно поверх ввода:

mv outfile.txt infile.txt

Если вы работаете на Linux-машине, это sed, Если вы на Windows, вы можете получить sed (а также mv) либо с Cygwin, либо с моей собственной оболочкой Hamilton C (включая бесплатную версию).

Добавлено:

Так как вы также хотели бы рассмотреть совпадения, которые заканчиваются в конце строки, то да, один из способов сделать это - заменить все концы строки специальным символом или строкой, выполнить нужные операции поиска / замены, а затем положить конец строки. назад, когда вы закончите.

Самый простой способ сделать преобразование конца строки с sed находится в отдельных этапах трубопровода. В моем примере я заменил \r\n последовательности с # но может быть совершенно произвольной строкой (но проще, если вы можете использовать один символ.)

sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt

Внутри вашего sedscript файл, вы затем будете искать / заменять оба варианта с пробелом между словами или чем-то, что вы заменили.

Если вы можете использовать только один символ и вам не нужна строка из нескольких символов, чтобы гарантировать уникальность, вы можете использовать \(...\) нотация для создания тегового регулярного выражения вокруг [...] список символов, которые могут отделить слово. Все, что совпадает, может быть вставлено в строку замены как \1,

Вот скриншот, как это может работать.

Разрывы строк с помощью sed

Обычно программы хороши в применении одной комбинации поиска и замены к нескольким файлам, а не наоборот.

Мне кажется, что вам лучше всего использовать программу текстового процессора с возможностями макросов. Затем вы можете написать функцию, которая выполняет замену, а затем вызывать ее сто раз со строками поиска / замены. К текстовым процессорам с поддержкой макросов относятся, например, LibreOffice Writer и Microsoft Word.

FART должен быть в состоянии помочь вам. Просто создайте пакетный файл с несколькими вызовами FART, и если вы хотите заменить новые строки (\r\n), включите использование синтаксиса в стиле C через -C или же --c-style параметры.

Другие вопросы по тегам