【问题标题】:Use a variable in a sed command在 sed 命令中使用变量
【发布时间】:2012-06-24 03:45:08
【问题描述】:

我似乎无法在 sed 命令中使用变量,例如:

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas

我想要 $ct_tname 变量,而不是字面意义上的 $ct_tname,这是我不断得到的。

有人知道如何让它工作吗?

问题其实比较复杂,我省略了一些信息。

ct_fname="%let outputfile="/user/ct_"$1".csv";"

这里,$1 是在我的 bash 脚本开始时传入的参数(sed 在 bash 脚本中运行)。

这不会成功运行,但如果我将ct_fname 替换为

,它会运行
ct_fname="%let table=ct_$1;"

有没有办法让第一个ct_fname成功通过?

【问题讨论】:

标签: bash variables sed escaping


【解决方案1】:

您需要使用双引号 (") 而不是单引号 (')。 单引号按字面意思传递它们的内容,而不翻译变量(扩展)。

试试

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas

顺便说一句,如果你要编辑一个文件(也就是说,如果 file2.sas 是一个临时文件),你应该改用ed

【讨论】:

  • 它在 S.O. 上出现了很多次。应该禁止再次回答:P我认为S.O.应该阻止发布一个问题,如果它发现一个类似的主题,好吧,不是阻止,而是在发布之前警告一个相似的问题已经得到回答,并让用户在继续发布他们的问题之前先检查一下。
  • 实际上,我的问题有点复杂,不能通过简单地将 ' 更改为 " 来解决,编辑后的问题在上面。我认为我面临的问题非常具有挑战性,而不是常见的查询关于这个问题出现了。
【解决方案2】:

就我而言,我只是用双引号替换了单引号:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done

目前,它运行良好...

【讨论】:

    【解决方案3】:

    问题是当$ct_fname 被替换时,sed 看到额外的/ 分隔符,所以

    sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
    

    变成

    sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas
    

    您将收到 sed 错误,因为有 5 个 / 而不是预期的 3 个。

    相反,将您的 sed 分隔符更改为未使用的字符,例如 |:,单引号或双引号都可以正常工作:

    sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
    sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas
    

    【讨论】:

    • 太棒了!当我的输入字符串充满 / 时,这对我有帮助。谢谢!
    【解决方案4】:

    Shell 变量不在单引号内展开。试试这个:

    sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
    

    【讨论】:

      【解决方案5】:

      您需要使用双引号 ("),单引号 (') 变量的值不会被替换。由于替换文本中有双引号,因此需要转义它们:

      sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
      

      【讨论】:

        【解决方案6】:

        其他答案侧重于在他们的示例中使用转义双引号。请注意,这并不总是您想要的:

        $ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/"
        foo"auie"bar
        $ FOO="auie"; echo foo123bar|sed "s/123/$FOO/"
        fooauiebar
        $ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/"
        fooauiebar
        $ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/"
        foo123bar
        

        【讨论】:

          猜你喜欢
          • 2022-01-08
          • 2017-07-10
          • 1970-01-01
          • 2013-10-09
          • 2023-01-02
          相关资源
          最近更新 更多