在一个文件中的字符串只替代第一次出现使用sed的

问题描述:

我有以下sed命令:在一个文件中的字符串只替代第一次出现使用sed的

sed 's'~"-log -asofdate $newAsOfDate "'~'"-log1"'~1' /export/home/ownclp/temp/runjava.sh.bk > $runjavaPath 

,而不是仅更换它替换所有发生的第一次出现,但。 注意:~是我的分隔符。

我该如何解决这个问题?

+2

你的意思是它在给定的行或文件中的多行上多次替换值?此外,该命令的引用是可怕的(并且不必要的复杂)。 –

+0

它在一行上多次替换该值。 对不起,引用。我是Unix新手,仍然不太熟悉语法 –

+0

什么版本的sed是这样的? –

假设你的意思是你要在第一行只替换模式的第一个实例地方出现你想要的东西是这样的:

sed "0,/-log -asofdate $newAsOfDate /s~-log -asofdate $newAsOfDate ~-log1~" /export/home/ownclp/temp/runjava.sh.bk > "$runjavaPath" 

至于$newAsOfDate似乎有一个/在里面,你需要使用备用地址的正则表达式标志像这个:

sed "0,\~-log -asofdate $newAsOfDate ~s~-log -asofdate $newAsOfDate ~-log1~" /export/home/ownclp/temp/runjava.sh.bk > "$runjavaPath" 
+0

使用你的解决方案给了我一个无法识别的命令:0,/ - log -asofdate 01/08/2015/s〜-log -asofdate 01/08/2015〜-log1〜error。 –

+0

这是因为模式中的斜杠。更新。 –

+0

使用更新后的版本,文件中根本没有任何变化。有没有另一种方法做到这一点更容易,也许使用awk? –

这可能会为你工作(GNU SED):

sed '\~-log -asofdate '"$newAsOfDate"' ~{s//-log1/;:a;n;ba}' oldFile >newFile 

这会替换第一个匹配所需的字符串,然后读取并打印文件的其余部分。

这种替代可能会为你工作:

sed -e '\~-log -asofdate '"$newAsOfDate"' ~!b' -e 's//-log1/' -e ':a' -e 'n' -e 'ba' oldFile >newFile 

第一个命令是包含所需字符串的地址匹配。备用分隔符~用于在shell变量"$newAsOfDate"包含默认/分隔符时使用。如果没有匹配(因此!b)该行是正常打印的,则命令b意味着中断后面的命令序列,并且由于b打印后没有占位符,则当前命令在第一个命令处重新开始。第二个-e声明表示在匹配后,替换先前地址的匹配部分,并用-log1替换它。接下来的三条语句设置了一个循环的机制。第一个是命名空间或循环占位符:a,第二个命令n表示打印当前行,然后用下一行替换模式空间,最后ba命令表示返回到循环占位符:a。一旦最后一行被打印,n命令也会退出任何未完成的命令。

+0

我正在使用Solaris sed,所以这绝对不会起作用 –

+0

@ArchitSharma我不熟悉Solaris(以及它使用的sed版本),但通常我已经通过将上述命令拆分为单独的命令并使用'-e'选项可以实现你的目标。请参阅编辑。 – potong

+0

你能解释你的答案吗?那么我可以尝试将它转换成solaris格式 –