正则表达式(替换)仅第一次匹配

Mic*_*ael 2 regex sed

我试图用正则表达式(sed)剪切(替换)一个字符串,但想要匹配第一次出现.在结果中,您可以看到它在第三个DATA处停止.

文本:

Cool Text Cool Text DATA : first text DATA : second text DATA : third text
Run Code Online (Sandbox Code Playgroud)

正则表达式:

sed 's/.*DATA//'
Run Code Online (Sandbox Code Playgroud)

结果:

 : third text
Run Code Online (Sandbox Code Playgroud)

Cas*_*yte 5

使用sed,您可以使用占位符的技巧:

sed  's/DATA/###/;s/.*###//;'
Run Code Online (Sandbox Code Playgroud)

使用gnu grep,您可以在perl模式下使用lookbehind:

grep -Po '(?<=DATA).*'
Run Code Online (Sandbox Code Playgroud)

  • +1.仅供参考,创建和使用输入中保证不存在的占位符字符串的方式如下:`sed's/a/aA/g; S/DATA/AB /; 小号/.*AB //; s/aA/a/g'file`.第一个替换在每个'a`之后放置一个'A`,以便之后`aB`(或`a`后跟`anything-but-A`)不能存在于输入中.第二个用'aB`替换第一个`DATA`.第三个将所有内容移除到`aB`.第四个将所有的'aA'改回``s`s.我发现这是多年来非常有用的成语. (2认同)