BASH - замена регулярного выражения в файле - PullRequest
2 голосов
/ 05 июня 2019

Имеются следующие файлы:

input_file:

My inputfile, contains multiple line 
and also special characters {}[]ä/

template_file:

Contains multiple lines,
also special characters {}[]ä/

##regex_match## <= must be replaced by input_file

Content goes on
abc

output_file:

Contains multiple lines,
also special characters {}[]ä/

My inputfile, contains multiple line 
and also special characters {}[]ä/

Content goes on
abc

Я думал оsed, но это было бы очень громоздко из-за побега и перевода строки.Есть ли другое решение в BASH?

Ответы [ 4 ]

3 голосов
/ 05 июня 2019

решение только для разнообразия.

perl -0777 -lpe'
    BEGIN {
        open $fh, "<", "input_file";
        $input = $fh->getline
    }
    s/##regex_match##/$input/
' < template_file > output_file
2 голосов
/ 05 июня 2019
sed -n -e '/##regex_match##/{r input_file' -e 'b' -e '}; p' template_file

Если регулярное выражение сопоставлено, прочитайте и выведите входной файл и ответвление (завершите обработку строки и не печатайте ее).В противном случае выведите строку.

Использование -e разделяет части команд sed, так что команда r, которая читает входной файл, знает, где заканчивается имя файла.В противном случае он жадно потребляет следующие sed команды, как если бы они были частью имени файла.

Фигурные скобки ограничивают блок в программе, который похож на оператор if.

Я проверял это на MacOS, но оно должно быть очень похоже на GNU.MacOS sed очень требователен к -e (среди прочих различий, которые здесь не вступают в силу).

1 голос
/ 05 июня 2019

С любым awk в любой оболочке на каждой коробке UNIX и с любыми символами:

$ awk 'NR==FNR{rec=rec sep $0; sep=ORS; next} /##regex_match##/{$0=rec} 1' input_file template_file
Contains multiple lines,
also special characters {}[]ä/

My inputfile, contains multiple line
and also special characters {}[]ä/

Content goes on
abc
1 голос
/ 05 июня 2019

A очень небольшое изменение в технике Деннис Уильямсон уже опубликовано, просто для целей обсуждения -

sed '/##regex_match##/ {
       r input_file
       d
     }' template_file
Contains multiple lines,
also special characters {}[]ä/

My inputfile, contains multiple line
and also special characters {}[]ä/

Content goes on
abc

cf руководство .

Он использовал опции -e для передачи команд, где я разделял их символами новой строки.Обычно точки с запятой достаточно, но, очевидно, r игнорирует другие команды в той же строке.

d предотвращает печать шаблона тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...