Как я могу grep / sed взять пар / найти из файла? - PullRequest
1 голос
/ 25 января 2020

Я хочу запустить поиск и замену, используя серию пар значений, взятых из файла (или двух файлов, если это облегчает задачу). Строки поиска и замены являются буквальными, а не регулярными выражениями в практическом смысле. На данный момент файл разделен табуляцией, findstring \t replacestring, по одной паре на строку, но я могу изменить это по мере необходимости.

Я немного знаю о регулярных выражениях, но с командами Unix мне действительно нужно очистить " Скопируйте и вставьте "инструкции. Ранее в этом проекте я был рад обнаружить grep -f, чтобы получить строки поиска из файла, но кажется, что grep не может сделать то же самое для строк замены .

Может Я делаю это со смесью grep, sed и так далее? Вышеуказанная ветка объясняет, как передать grep в sed, но затем я должен сказать sed, как читать строки замены из файла.

Я использую macOS (с домашним пивом), если это имеет значение.

1 Ответ

1 голос
/ 25 января 2020

Вы можете создать файл со списком таких команд sed, как этот, в файле с именем commands.sed:

s|cat|cats|g
s|dog|dogs|g
s|person|people|g

и запустить его на некотором входе с помощью:

echo "House mouse cat dog person dog person" | sed -f commands.sed

и он заменит cat на cats, dog на dogs и person на people, создавая:

House mouse cats dogs people dogs people

Итак, мы хотим превратить ваш файл с подстановками в такой командный файл - используя sed! Итак, если ваш файл замен subs.txt содержит такие строки с двумя словами в каждой строке, разделенными табуляцией:

cat cats
dog dogs
person  people

Это будет:

sed -e 's/^/s|/' -e $'s/\t/|/' -e 's/$/|g/' subs.txt > commands.sed

, а затем вы можно применить его с помощью:

sed -f commands.sed SomeFile

Вместо того, чтобы создавать файл с командами, мы можем запустить process substitution, как это, чтобы динамически генерировать их, и сделать все это в одном go с:

echo "House mouse cat dog person dog person" | sed -f <(sed -e 's/^/s|/' -e $'s/\t/|/' -e 's/$/|g/' subs.txt)
...