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

时间:2015-02-26 14:04:59

标签: regex sed

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

文本:

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

正则表达式:

sed 's/.*DATA//'

结果:

 : third text

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

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

那将停在第一个 DATA

答案 2 :(得分:0)

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

Sed总是尝试采用最大的模式,所以在你的问题中,它需要所有直到最后一个DATA(最大可能)。我只是通过保持最大的反向构造。