【问题标题】:Replacing string in linux using sed/awk based使用基于 sed/awk 替换 linux 中的字符串
【发布时间】:2015-10-25 04:53:33
【问题描述】:

我想换这个

#!/usr/bin/env bash

有了这个

   #!/bin/bash

我尝试了两种方法

方法一

original_str="#!/usr/bin/env bash"
replace_str="#!/bin/bash"

sed s~${original_str}~${replace_str}~ filename

方法二

line=`grep -n "/usr/bin" filename`
awk NR==${line} {sub("#!/usr/bin/env bash"," #!/bin/bash")}

但它们都不起作用。

【问题讨论】:

  • “不工作”从来都不是一个足够好的问题描述。请更具体(解释究竟发生了什么并显示错误消息)。

标签: regex linux bash awk sed


【解决方案1】:

您不能在 BASH 中的双引号内使用 !,否则会发生历史扩展。

你可以这样做:

original_str='/usr/bin/env bash'
replace_str='/bin/bash'

sed "s~$original_str~$replace_str~" file
#!/bin/bash

【讨论】:

  • 谢谢,这显然在drone.io 中也需要
【解决方案2】:

使用转义字符:

    $ cat z.sh
    #!/usr/bin/env bash

    $ sed -i "s/\/usr\/bin\/env bash/\/bin\/bash/g" z.sh

    $ cat z.sh
    #!/bin/bash

【讨论】:

    【解决方案3】:

    在终端试试这个:

    echo "#!/usr/bin/env bash" | sed 's:#!/usr/bin/env bash:#!/bin/bash:g'

    在这种情况下,我使用 : 因为 sed 会混淆不同的斜杠,并且它无法再用一个分隔符来区分,而其中一个是文本的一部分。 而且它看起来真的很干净。 很酷的是,您可以使用所需的每个符号作为分隔符。 例如分号 ; 或管道符号 | 。 通过使用转义字符 \,考虑到您必须将它放在命令中的每个正斜杠之前这一事实,我认为代码看起来太乱并且不太可读。

    上面的命令只会打印出替换的行,但是如果你想修改文件,你需要指定输入和输出文件,像这样:

    sed 's:#!/usr/bin/env bash:#!/bin/bash:g' <inputfile >outputfile-new

    如果输入文件和输出文件具有相同的名称,请记住输入-new,因为如果没有它,您的原始文件将被完全清除:这发生在我过去,这根本不是最好的事情。例如:

    <test.txt >test-new.txt

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2017-02-08
      • 2015-01-13
      • 2016-05-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2014-10-19
      相关资源
      最近更新 更多