BASH-替换文件中的正则表达式匹配

时间:2019-06-05 11:48:19

标签: regex bash perl sed

给出以下文件:

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 个答案:

答案 0 :(得分:3)

解决方案仅仅是出于多样性的考虑。

perl -0777 -lpe'
    BEGIN {
        open $fh, "<", "input_file";
        $input = $fh->getline
    }
    s/##regex_match##/$input/
' < template_file > output_file

答案 1 :(得分:2)

sed -n -e '/##regex_match##/{r input_file' -e 'b' -e '}; p' template_file

如果正则表达式匹配,则读取并输出输入文件并分支(结束该行的处理,不要打印它)。否则,打印行。

使用-e分隔了sed命令的某些部分,以便读取输入文件的r命令知道文件名的结尾。否则,它将贪婪地消耗以下sed命令,就好像它们是文件名的一部分一样。

大括号在程序中分隔一个类似于if语句的块。

我在MacOS上进行了测试,但是对于GNU来说应该非常相似。 MacOS sed-e更具挑剔性(还有其他一些差异在这里没有发挥作用)。

答案 2 :(得分:1)

已经发布的技术Dennis Williamson非常略有不同,仅出于讨论目的-

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

c.f。 the manual

他使用了-e选项来传递命令,在这里我用换行符将它们分开。通常,分号就足够了,但是显然r会使同一行上的其他命令被忽略。

d阻止打印标签图案。

答案 3 :(得分:1)

在每个UNIX框上的任何外壳中的任何awk以及任何字符:

$ 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