2014-05-20 212 views
1

我正在使用下面的sed命令進行搜索和替換操作。在第一個匹配項中搜索並替換字符串

sed -i '/searchstring/s|find string|replace string|g' filename 

它改變輸入文件中的所有事件。我怎麼能只做一次。

謝謝。

例如,

a 

a 

b 

b 

a 

c 

d 

此輸入文件。

命令我已經使用類似下面,

sed -i '/a/s|a|changed|g' filename 

輸出我得到像下面,

changed 

changed 

b 

b 

changed 

c 

d

即,其進行的變更3次。我不得不改變一次。

的預期產出的,

changed 

a 

b 

b 

a 

c 

d 

回答

2

您可以使用此sed

sed -i '/searchstring/s|find string|replace string|' 

注:刪除g (global substitution)

根據您的更新用,

sed -i '/search/{ s/search/changed/; t loop;}; :loop; n; b loop' yourfile 
+0

謝謝,需要的是我想只替換一次。但給定的命令替換所有行中的字符串。 – user3304467

+1

+1也適用於gnu sed,它可以做'sed's/foo/bar/n''' n'是第n次出現。 – Kent

+0

@ user3304467您應該在您的問題中指定整個文件中的「僅第一次出現」** – Kent

1

卸下g是正確的做法,但只是爲了顯示它是如何與awk

awk '/searchstring/ {sub(/find string/,"replace string")}1' file 
1

,如果你想替換整個文件中的第一次出現:

awk '!f&&/search/{sub(/find/,"replace");f=7}7' file 

或與g

awk '!f&&/search/{gsub(/find/,"replace");f=7}7' file 

的需要

1

它可能不是最完美的解決方案,但它是非常容易理解的一個:

[email protected]:/tmp$ o="a";n="changed"; line=$(cat file | grep -n "$o" | cut -d: -f1| sort -n | head -1); sed -i.bak "$line s/$o/$n/g" file; cat file 
changed 

a 

b 

b 

a 

c 

d 

說明:

找到行號匹配的第一次出現,然後在該行上運行替換。

1

使用GNU的sed,

sed '0,/searchstring/ { /searchstring/ s|find string|replace string|g }' filename 

與任何g標誌調整需要。

相關問題