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

3 ответа3

1

Пожалуйста, исправьте меня, если я неправильно понял ваш вопрос, но из вашего описания я понимаю, что у вас есть один (возможно, очень большой) документ 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, вы можете получить sedmv) с 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

0

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

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

0

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

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