【发布时间】:2019-11-09 15:43:56
【问题描述】:
给定以下文件:
输入文件:
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
输出文件:
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 有效。知道如何处理吗?
【问题讨论】:
-
sed不支持 PCRE,仅支持 POSIX BRE/ERE 正则表达式。 -
您是否知道如何在没有环视的情况下实现这一点?检测 {my_file.global} 并提取 my_file.global,不带大括号?
-
Perl 支持 Perl 正则表达式,带有环视和诸如此类的东西。为什么需要 sed?
-
好吧,它似乎可以与
/\{.+\.global}/、sed -r -n -e '/\{.+\.global}/{r input_file' -e 'b' -e '}; p' template_file_2 > output_file一起使用 -
@glennjackman 实际上,OP 使用的是
-r,它与-E相同。我知道-E更便携,但它适用于 OP,也适用于我。