我尝试了以下代码,但它并没有实现我想要的效果:
echo "include(file.txt)" | sed -E 's/include\(([^)]+)\)/'$(cat $(readlink -f /tmp/$1))'/g'
我需要用文件内容替换一些特殊词。这类似于 PHP 的“include”功能。
答案1
使用 GNU sed,你可以使用e
修饰符来埃替换后执行替换模式:
埃
此命令允许将 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并用其输出替换模式空间。将抑制尾随换行符;如果要执行的命令包含 NUL 字符,则结果不确定。这是 GNU sed 扩展。
例如给定
$ cat /tmp/file.txt
foo bar
baz
然后
$ echo "include(file.txt)" | sed -E 's:include\(([^)]+)\):cat /tmp/\1:e'
foo bar
baz
或者(不确定你为什么需要readlink
这里)
$ echo "include(file.txt)" | sed -E 's:include\(([^)]+)\):cat "$(readlink -f "/tmp/\1")":e'
foo bar
baz
请注意整个模式空间由于执行了成功替换而产生,并且由其执行/bin/sh
(因此您需要避免“bashisms”)。