2014-09-01 104 views
0

我有一个sed文件,用其他字符串替换文件中所有字符串。 我想这样做在线,但没有使用-i从终端 什么变化的.sed文件sed命令文件中的标志

#!/bin/sed 
s/include/\#include/ 
+3

我不认为你可以做到这一点。 'sed'命令文件只能包含命令,而不能包含选项。 – Barmar 2014-09-01 09:31:33

+0

尝试(我猜)'#i'在脚本/动作列表的第一行。它适用于'-n',所以可能也适用于其他选项 – NeronLeVelu 2014-09-01 10:50:08

+0

不可以,它不起作用@NeronLeVelu – saisandeep 2014-09-01 10:54:17

回答

0

只需使用awk来进行:

{ sub(/include/,"#include"); rec = rec $0 RS } 
END{ printf "%s", rec > FILENAME } 

,或者如果你想操作严格上字符串:

BEGIN{ old="include"; new="#include" } 
s = index($0,old) {$0 = substr($0,1,s-1) new substr($0,s+length(old)) 
{ rec = rec $0 RS } 
END{ printf "%s", rec > FILENAME } 

这可以简化为:

s = index($0,"include") {$0 = substr($0,1,s-1) "#" substr($0,s) 
{ rec = rec $0 RS } 
END{ printf "%s", rec > FILENAME } 

在这种特殊情况下,只是将#预先设置为一个字符串。

0

我不认为它会工作,因为-i-f选项通常都可以有参数,但你可能是幸运的。

shebang行可以包含一个选项组(又名集群)。你会需要它包含-f(这是从你的榜样缺失),因此集群可能看起来像

#!/bin/sed -if 

前提是你的话并不需要的参数来-i选项,并在允许集群这样的第一名(-if专业-i -f)。

明显的解决方法是将脚本更改为shell脚本; -f选项不再需要,因为该脚本不在文件中。

#!/bin/sh 
exec sed -i 's/include/\#include/' "[email protected]"