使用基于sed/awk的linux替换linux中的字符串

Sub*_*thi 4 linux bash awk sed

我想替换它

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

有了这个

   #!/bin/bash
Run Code Online (Sandbox Code Playgroud)

我试过两种方法

方法1

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

sed s~${original_str}~${replace_str}~ filename
Run Code Online (Sandbox Code Playgroud)

方法2

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

但他们两个都没有工作.

anu*_*ava 18

您不能!在BASH中使用双引号,否则将进行历史扩展.

你可以这样做:

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

sed "s~$original_str~$replace_str~" file
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 它给`表达式#1,char 13:`s``的未知选项 (9认同)
  • 那么什么时候这个错误`s'未知的选项发生在什么时候? (3认同)
  • 使用TILDE保存了我的一天。谢谢 (2认同)

小智 5

使用转义字符:

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

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

    $ cat z.sh
    #!/bin/bash
Run Code Online (Sandbox Code Playgroud)