regex - SED:同一行上有多个模式,如何匹配/解析第一个

标签 regex parsing sed last-occurrence

我有一个文件,其中包含电话号码数据以及一些无用的东西。
我正在尝试解析数字,并且当只有1个电话号码/线路时,这没问题。
但是当我有多个数字时,sed匹配最后一个数字(即使到处都说它应该只匹配第一个模式?),而我无法获取其他数字。

我的data.txt:

bla bla bla NUM:09011111111 bla bla bla bla NUM:08022222222 bla bla bla


当我解析数据时,我的想法是首先删除第一个电话号码前面的所有“初始”“ bla bla bla”(因此我搜索首次出现的“ NUM:”),然后删除所有内容电话号码后,然后获取号码。
之后,我想解析剩余字符串中的下一个匹配项。

所以现在当我尝试sed时,我总是会得到行中的最后一个数字:

>sed 's/.*NUM://' data.txt
08022222222 bla bla bla
> 


首先,我想了解我对SED的理解出了什么问题。当然,欢迎提出更有效的建议!
我的sed命令不是说用“(空)”替换“ NUM:”之前的所有内容吗?为什么总是匹配最后一次出现?

谢谢!

最佳答案

这可能对您有用:

echo "bla bla bla NUM:09011111111 bla bla bla bla NUM:08022222222 bla bla bla" |
sed 's/NUM:/\n&/g;s/[^\n]*\n\(NUM:[0-9]*\)[^\n]*/\1 /g;s/.$//'
NUM:09011111111 NUM:08022222222


您遇到的问题是理解.*是贪婪的,即它匹配最长匹配而不是第一个匹配。通过在我们感兴趣的字符串前面放置一个唯一字符(\n sed将其用作行定界符,因此它不能存在于行中),并删除所有不是该唯一字符后跟唯一字符NUM:...,我们有效地将字符串分成了易于管理的部分。

关于regex - SED:同一行上有多个模式,如何匹配/解析第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681393/

相关文章:

sql - Maven 版本排序

regex - 正则表达式 (\S+?) 与 (\S+))

Java 空格和标点符号的分隔符模式?

ios - 无法将数据加载到自定义 Collection View 中

python - 如何在Python中使用正则表达式从字符串中删除两个 "underline-numeric"子字符串?

php - 仅当正则表达式不在标签内时如何匹配它

Java解析网站

bash - 行 sed/awk 的修改副本

linux - 在 procmail 中打印出变量

linux - 如何使用sed删除带通配符的字符串