SED - Regex не работает - PullRequest
       15

SED - Regex не работает

0 голосов
/ 27 июня 2019

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

input_file :

if_line1
if_line2

template_file_1 :

temp_file_line1
temp_file_line2

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

temp_file_line3

template_file_2 :

temp_file_line1
temp_file_line2

{my_file.global} <= must be replaced by input_file

temp_file_line3

output_file :

temp_file_line1
temp_file_line2

if_line1
if_line2

temp_file_line3

Для template_file_1 работает следующая команда sed:

sed -n -e '/##regex_match##/{r input_file' -e 'b' -e '}; p' template_file_1 > output_file

Однако для template_file_2 аналоговая команда sed завершается неудачно:

sed -r -n -e '/(?<={).+\.global(?=})/{r input_file' -e 'b' -e '}; p' template_file_2 > output_file

sed жалуется, что регулярное выражение было недопустимым

Заданное регулярное выражение по крайней мере PCREдействителен, например grep -oP '(?<={).+\.global(?=})' template_file_2 работает.Есть идеи, как с этим бороться?

Ответы [ 2 ]

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

точно знаю, для чего предназначен этот PCRE, но, догадываясь об этом, это будет работать при использовании любого awk в любой оболочке на каждом компьютере UNIX:

$ awk 'NR==FNR{new=new s $0; s=ORS; next} /##regex_match##/{$0=new} 1' input_file template_file_1
temp_file_line1
temp_file_line2

if_line1
if_line2

temp_file_line3

$ awk 'NR==FNR{new=new s $0; s=ORS; next} /\{[^.{}]+\.global}/{$0=new} 1' input_file template_file_2
temp_file_line1
temp_file_line2

if_line1
if_line2

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

perl однострочников:

perl -pe 'do {local $/; open $f, "<input_file"; $_ = <$f>; close $f} if /\{.+?\.global\}/' template_file_2

или, возможно, этот, а не "чистый" perl

perl -ne 'if (/\{.+?\.global\}/) {system("cat","input_file")} else {print}' template_file_2

Использование модулей CPAN может сделать это действительно аккуратно:

perl -MPath::Tiny -pe '$_ = path("input_file")->slurp if /\{.+?\.global\}/' template_file_2
...