正则表达式(替换)仅第一个匹配
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(最大可能)。我只是用保持最大的反向构造。
我正在尝试使用正则表达式 (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(最大可能)。我只是用保持最大的反向构造。