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