我有一个文件,其中包含电话号码数据以及一些无用的东西。
我正在尝试解析数字,并且当只有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/