我想替换这个
#!/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")}
但他们两个都没有工作。
答案 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