【问题标题】:sed variable replacement does not seem to worksed 变量替换似乎不起作用
【发布时间】:2011-01-07 18:41:47
【问题描述】:

我在shell中设置了一个变量:

-bash-3.00$ echo $source_repl
source ../setup_simple.tcl

然后我尝试用变量字符串替换文件中以字符串“package require IxLoad”开头的行(注意双引号是让 sed 使用变量替换的方法)。首先我尝试了直接替换(没有转义变量中的 $):

-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
sed: -e expression #1, char 38: unknown option to `s'
-bash-3.00$

所以我认为转义 $ 可以解决问题,但正如您所见,该行随后被文字字符串“$source_repl”替换,而不是存储在那里的变量:

-bash-3.00$ sed -e "s/package require IxLoad.*/\$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl
11c11
< package require IxLoad
---
> $source_repl
-bash-3.00$ 

我查找了许多关于如何在 sed 中进行变量替换的网站,它们似乎都表明上述方法应该有效。我错过了什么?实际变量中是否存在导致这种情况的原因?

一个

【问题讨论】:

    标签: variables sed


    【解决方案1】:

    您的变量中有一个/。使用@作为模式分隔符,这样就可以了。

    sed -e "s@package require IxLoad.*@$source_repl@g" smtp_tput191Mb.tcl > tmpwatch.tcl
    

    【讨论】:

    • 谢谢。我只是注意到了。我以错误的方式盯着问题。
    【解决方案2】:

    我一般不知道如何解决这个问题(更改分隔符很容易,但你永远不知道变量中可以包含什么),但如果你可以使用 perl 而不是 sed,你可以在 perl 中加载环境变量表单以避免转义问题:

    perl -pe 's/package require IxLoad.*/$ENV{source_repl}/g' smtp_tput191Mb.tcl > tmpwatch.tcl
    

    【讨论】:

      【解决方案3】:

      抱歉,各位,浪费了你们的时间。我发现了问题。我需要转义实际变量中的点和斜线,以便用 sed 语句替换它:

      -bash-3.00$ echo $source_repl
      source \.\.\/setup_simple\.tcl
      -bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
      -bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl                                          11c11
      < package require IxLoad
      ---
      > source ../setup_simple.tcl
      -bash-3.00$
      

      谢谢

      【讨论】:

      • s/// 命令右侧的点不需要转义。
      猜你喜欢
      • 2020-04-12
      • 2015-06-10
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多