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

Regular Expression (Replace) only first match

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

正文:

Cool Text Cool Text DATA : first text DATA : second text DATA : third text

正则表达式:

sed 's/.*DATA//'

结果:

 : third text

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

sed  's/DATA/###/;s/.*###//;'

通过 gnu grep,您可以在 perl 模式下使用回顾:

grep -Po '(?<=DATA).*'

如果你可以切换到 perl,你可以使用非贪婪量词:

echo "$string" | perl -pe 's/.*?DATA//'
# .............................^

那将停止在 第一个 数据

sed 's/DATA\(.*\)/&#/;s/.*DATA\(.*\)#//' YourFile

Sed 总是尝试采用最大的模式,因此在您的问题中,它一直采用直到最后一个 DATA(最大可能)。我只是用保持最大的反向构造。