Как я могу выполнить большое количество различных операций поиска / замены?
У меня несколько раз был текстовый документ, к которому мне нужно применить несколько сотен операций поиска / замены. Эти находки / замены не следуют шаблону, к которому может быть применено регулярное выражение, и должны применяться по порядку. Ранее после долгих поисков я прибегал к их выполнению вручную, но есть ли лучший способ?
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
,
Вот скриншот, как это может работать.
Обычно программы хороши в применении одной комбинации поиска и замены к нескольким файлам, а не наоборот.
Мне кажется, что вам лучше всего использовать программу текстового процессора с возможностями макросов. Затем вы можете написать функцию, которая выполняет замену, а затем вызывать ее сто раз со строками поиска / замены. К текстовым процессорам с поддержкой макросов относятся, например, LibreOffice Writer и Microsoft Word.
FART должен быть в состоянии помочь вам. Просто создайте пакетный файл с несколькими вызовами FART, и если вы хотите заменить новые строки (\r\n
), включите использование синтаксиса в стиле C через -C
или же --c-style
параметры.