sed 与外部脚本文件 - 如何应用 shell 变量?

sed 与外部脚本文件 - 如何应用 shell 变量?

直接在命令行上,这有效:

$sed "s/a/X/;s/X/&a&/" file

使用 shell 变量也是如此:

$varin=a ; varout=X ; sed "s/$varin/$varout/;s/$varout/&$varin&/" file

但是使用外部脚本文件

$sed -f script.sed file

只有“硬编码”方法才有效

$cat script.sed
s/a/X/
s/X/&a&/

虽然 shell 变量没有扩展

$cat script.sed
s/$varin/$varout/
a/$varout/&$varin&/

$varin=a ; varout=X ; sed -f script.sed file
#-> variables in script.sed not interpreted; output unchanged

如何实现外部脚本文件中shell变量的解释sed

我很明白它sed本身无法解释 shell 变量,但是我如何预处理脚本(以保存方式)以一次运行它来bash解析变量?也许人们可以sed在一开始就使用命令将它们导入?

以下方法没有成效(使用bash):

  • 使用export varin=a ; export varout=X
  • via sed -e $(cat sed.script) file:适用于单行脚本,在多行脚本上失败,即使注释作为第一行
  • sed -f <(cat script.sed) file
  • eval sed -f script.sed file

答案1

您可以envsubst在运行之前将脚本中的变量替换为预期值sed

$ cat script.sed
s/$varin/$varout/
s/$varout/&$varin&/

将字符串$varinor${varin}$varoutor ${varout}in替换script.sed为其变量值:

$ varin='a' varout='X' envsubst '$varin $varout' <script.sed
s/a/X/
s/X/&a&/

sed使用进程替换的命令:

sed -f <(varin='a' varout='X' envsubst '$varin $varout' <script.sed) file

答案2

赫里多克来救援:

varin=a; varout=X
sed -f - <<_CODE_    file
s/$varin/$varout/
_CODE_

但请注意,如果 shell 变量在没有适当清理的情况下被空投到内部,这种方法就会充满错误/不正确的结果。举个例子,如果 varout 包含字符&等会发生什么/

相关内容