在Bash中使用sed命令进行字符串替换问题

时间:2016-06-14 15:08:36

标签: sed

我一直在寻找一种方法来查找和替换当前目录中所有fortran文件中的字符串。这里的大多数答案都与使用相关:

sed -i 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f

perl -pi -w -e 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f

然而,当我使用其中任何一个时,bash行继续>弹出下一行,好像它正在期待输入或另一个参数。我还没有看到其他人遇到这个,我不知道该怎么做。我的命令是不正确的;我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

原作有两个问题:

  • 您没有保护文字数据中的/不被sed解析而是被视为数据。一种非常易读且明确的方法是使用[/]
  • 您尝试使用\'将文字'放入单引号字符串中。这不起作用。常见的习语是'"'"',它逐个字符地执行以下操作:

    1. ' - 退出原始单引号上下文
    2. " - 打开双引号上下文
    3. ' - 添加文字单引号(受周围双引号保护)
    4. " - 结束双引号上下文
    5. ' - 恢复外部单引号上下文。

因此,请考虑:

# note: this works with GNU sed, not MacOS sed or others
sed -i 's/INCLUDE '"'"'atm[/]params.inc'"'"'/USE params/g' *.f