仅在第一行匹配后插入?

Jé *_*eue 7 unix sed

试着这样做:

sed -e '/^MatchMeOnce/i\
MATCHED'
Run Code Online (Sandbox Code Playgroud)

在示例文本上:

Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6
Run Code Online (Sandbox Code Playgroud)

如何使其仅匹配第一个记录事件并且在后续行上匹配?

Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
Run Code Online (Sandbox Code Playgroud)

pot*_*ong 7

这可能对你有用:

sed '1,/MatchMeOnce/s//MATCHED/' file
Run Code Online (Sandbox Code Playgroud)

这适用于sed的所有变体,只要MatcMeOnce在第二行或更高,或者这个(GNU sed):

sed '0,/MatchMeOnce/s//MATCHED/'  file
Run Code Online (Sandbox Code Playgroud)

适合上述边缘条件:

或者将整个文件篡改到内存中的另一种方法(所有sed):

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/' file
Run Code Online (Sandbox Code Playgroud)

这有一个额外的好处,因为如果你想选择第n个而不是MatchMeOnce你需要做的第一个就是更改出现标志,即更改第二个出现:

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/2' file
Run Code Online (Sandbox Code Playgroud)

要更改最后一次使用:

sed ':a;$!{N;ba};s/\(.*)MatchMeOnce/\1MATCHED/' file
Run Code Online (Sandbox Code Playgroud)


min*_*ret 1

当任何替换匹配时, GNU sed 有t命令分支到脚本末尾(或者给定标签)。

我个人使用perl -neand perl -ane(我想有些人使用 Ruby),除非 awk 或 sed 解决方案非常明显。但我意识到某些系统仍然可能有 awk 和 sed 而没有 Perl,这使得安装 Perl 变得困难;无论如何,有些程序员更喜欢 awk 和 sed。