Raf*_*lGP 24 sed perl text-processing
我有一个文本文件 ( devel.xml)。
我在其中添加了 REPLACETHIS 一词,以便用不同文件 ( temp.txt) 中的内容替换此字符串。
我最接近的是这个:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Run Code Online (Sandbox Code Playgroud)
这会在字符串之后插入内容,然后在之后删除字符串。
这是最好的方法吗?
Gil*_*il' 40
您所做的是删除SUBSTITUTETHIS文件中出现的任何位置(但不是出现该行的其余部分)并插入该temp.TXT行下方的内容。如果SUBSTITUTETHIS在一行中多次出现,则仅删除第一次出现,并仅temp.TXT添加一个副本。
如果要在SUBSTITUTETHIS出现时替换整行,请使用该d命令。由于您需要同时运行,r并且d当有比赛时,请将它们放在一个支撑组中。
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
Run Code Online (Sandbox Code Playgroud)
一些 sed 实现允许您使用分号分隔命令并完全省略大括号周围的分隔符,但您仍然需要换行符来终止r命令的参数:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Run Code Online (Sandbox Code Playgroud)
如果想用SUBSTITUTETHIS文件内容替换,但保留前后的内容就行了,就比较复杂了。最简单的方法是在 sed 命令中包含文件的内容;请注意,您必须正确引用其内容。
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Run Code Online (Sandbox Code Playgroud)
或者使用 Perl。这很短,但cat每次替换运行一次:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
Run Code Online (Sandbox Code Playgroud)
在脚本启动时读取文件一次,并避免依赖于 shell 命令:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
Run Code Online (Sandbox Code Playgroud)
(为了便于阅读,分两行显示,但您可以省略换行符)。如果文件名是可变的,为避免引用问题,请通过环境变量将其传递给脚本:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
Run Code Online (Sandbox Code Playgroud)