用另一个文件的内容替换文件中的模式


20

我有一个文本文件(devel.xml)。

我在其中添加了单词REPLACETHIS,以便将该字符串替换为其他文件(temp.txt)中的内容。

我最接近的是:

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

这会将内容插入字符串后,然后再删除字符串。

这是最好的方法吗?


它必须被镇静吗?根据temp.txt中的文本量,我可能会采用perl解决方案。
user17591 2012年

Answers:


34

您要做的是删除SUBSTITUTETHIS文件中出现的所有位置(而不是出现在该行的其余部分),并temp.TXT在该行下方插入内容。如果SUBSTITUTETHIS一行上出现多次,则仅删除第一个匹配项,并且仅temp.TXT添加一个副本。

如果要在SUBSTITUTETHIS显示时替换整行,请使用d命令。由于您需要同时进行比赛rd比赛,因此将它们放在支撑组中。

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

某些sed实现使您可以使用分号来分隔命令,并完全省略括号之间的分隔符,但是您仍然需要换行符来终止r命令的参数:

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

如果要替换SUBSTITUTETHIS文件的内容,但保留在线之前和之后的内容,则更为复杂。最简单的方法是将文件内容包含在sed命令中;请注意,您必须正确引用其内容。

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

或使用Perl。这很短,但cat每次替换运行一次:

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

要在脚本启动时一次读取文件,并避免依赖于shell命令:

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(为便于阅读,以两行显示,但您可以省略换行符)。如果文件名是变量,为避免引用问题,请通过环境变量将其传递给脚本:

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

我该如何更改perl命令,以代替cat temp.txt我可以做的事情cat ${variable}
玛丽亚·因内斯·帕尼萨里'17

@MariaInesParnisari我在注释格式上犯了一个错误。请参阅我的答案,并提供一个稍有不同,更可靠的解决方案。
吉尔斯(Gilles)'所以

由于File :: Slurp并非始终安装,因此,另一种选择是使用-0777开关将整个文件插入到文件中,然后执行常规操作openperl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
mivk

如何r temp.TXT使用“ BEGIN temp.TXT”,“ END temp.TXX”之类的消息进行包装
kyb

我为我的问题找到了解决方案。使用a(添加)命令。grymoire.com/Unix/Sed.html#uh-36
kyb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.