4

У меня есть два файла, один из которых содержит список шаблонов, другой необходимо изменить на основе этих шаблонов. До сих пор я экспериментировал с

cat patterns.txt| xargs -n1| sed 's/patternfromfile/subtitution/'

но я не уверен, как ввести xargs в 's/here//'

Спасибо

3 ответа3

5

Вам может потребоваться опция -i для xargs (подробности смотрите на странице man). Это по существу заменяет {} шаблоном и запускает команду один раз для шаблона. Таким образом, он будет запускать sed для файла один раз для каждого шаблона; Вы должны иметь это в виду при создании шаблонов.

user@host [/tmp]$ cat patterns
a
[pd]ie
user@host [/tmp]$ cat file
hat
cherry pie
die alone
eat cake
user@host [/tmp]$ cat patterns | xargs -i sed 's/{}/moo/' file
hmoot
cherry pie
die moolone
emoot cake
hat
cherry moo
moo alone
eat cake

В качестве альтернативы, вы можете использовать что-то другое для динамической сборки сценария sed из файла шаблонов. Например, вы можете использовать sed в файле шаблона, чтобы применить их все за один проход к файлу. :)

user@host [/tmp]$ sed 's|^|s/|;s|$|/moo/;|' patterns | tee patterns.sed
s/a/moo/;
s/[pd]ie/moo/;
user@host [/tmp]$ sed -f patterns.sed file
hmoot
cherry moo
moo moolone
emoot cake
0

Вы можете построить регулярное выражение, как это:

regex=$(tr '\n' '|' < patterns.txt)
sed -ri "s/$regex/replacement/" filename

Вы можете добавить флаг "g" в команду s///.

0

Не зная, какие шаблоны у вас есть:

Используйте опцию -i, если вы хотите редактировать свой файл напрямую:

   while read pattern
    do
        sed -i 's/"${pattern}"/substitution/' yourfile
    done < patterns.txt

В качестве альтернативы перенаправьте вывод в новый файл:

   while read pattern
    do
        sed 's/"${pattern}"/substitution/' yourfile >> outfile
    done < patterns.txt

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