2015-08-28 48 views
0

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

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

,而不是僅更換它替換所有發生的第一次出現,但。 注意:~是我的分隔符。

我該如何解決這個問題?

+2

你的意思是它在給定的行或文件中的多行上多次替換值?此外,該命令的引用是可怕的(並且不必要的複雜)。 –

+0

它在一行上多次替換該值。 對不起,引用。我是Unix新手,仍然不太熟悉語法 –

+0

什麼版本的sed是這樣的? –

回答

1

假設你的意思是你要在第一行只替換模式的第一個實例地方出現你想要的東西是這樣的:

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? –

0

這可能會爲你工作(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格式 –

相關問題