如何使用 sed 替换 cat 文件内容

如何使用 sed 替换 cat 文件内容

我尝试了以下代码,但它并没有实现我想要的效果:

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”)。

相关内容