我使用以下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
答案 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
标记。