使用基于sed / awk的

时间:2015-08-03 07:04:33

标签: linux bash awk sed

我想替换这个

#!/usr/bin/env bash

用这个

   #!/bin/bash

我尝试了两种方法

方法1

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

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

方法2

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

但他们两个都没有工作。

3 个答案:

答案 0 :(得分:13)

您不能在BASH的双引号内使用!,否则将进行历史记录扩展。

你可以这样做:

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

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

答案 1 :(得分:4)

在终端试试这个:

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

答案 2 :(得分: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