在第一次出现时搜索并替换字符串

时间:2014-05-20 08:56:18

标签: linux sed terminal

我使用以下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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

删除g是正确的方法,但只是为了说明如何使用awk

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

答案 2 :(得分:1)

如果要替换整个文件中的第一个匹配项:

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

或使用g

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

是你需要的。

答案 3 :(得分:1)

它可能不是最优雅的解决方案,但它很容易理解:

tiago@dell:/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

说明:

找到第一次匹配的行号,然后在该行上运行替换。

答案 4 :(得分:1)

使用gnu sed,

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

您需要调整任何g标记。