给出以下文件:
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中还有其他解决方案吗?
答案 0 :(得分:3)
perl解决方案仅仅是出于多样性的考虑。
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