jul*_*mme 16 regex parsing sed last-occurrence
我有一个文件,其中包含电话号码数据,还有一些无用的东西.我正在尝试解析数字,当只有1个电话号码/线时,这不是问题.但是当我有多个数字时,sed匹配最后一个(即使它说它应该只匹配匹配第一个模式?),我不能得到其他数字..
我的data.txt:
bla bla bla NUM:09011111111 bla bla bla bla NUM:08022222222 bla bla bla
Run Code Online (Sandbox Code Playgroud)
当我解析数据时,我的想法是首先删除第一个电话号码前面的所有"初始""bla bla bla"(所以我搜索第一次出现'NUM:'),然后我删除所有的东西电话号码后,并获取号码.之后我想从剩余的字符串中解析下一个匹配项.
所以现在当我尝试sed它时,我总是得到最后一个数字:
>sed 's/.*NUM://' data.txt
08022222222 bla bla bla
>
Run Code Online (Sandbox Code Playgroud)
主要是我想了解我对SED的理解有什么问题.当然,欢迎更有效的建议!不是我的sed命令说,用''(空)替换'NUM:'之前的所有内容?为什么它总是与最后一次匹配?
谢谢!
pot*_*ong 21
这可能对你有用:
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
Run Code Online (Sandbox Code Playgroud)
你遇到的问题是理解它.*是贪婪的,即它匹配最长的匹配而不是第一个匹配.通过在\n我们感兴趣的字符串前面放置一个唯一的字符(sed使用它作为行分隔符使其不能存在于行中NUM:...)并删除那些不是唯一字符[^\n]*的所有字符\n,我们有效将字符串拆分为可管理的部分.
Edu*_*nec 11
正如你现在所知,正则sed表达式是贪婪的,据我所知,不能贪得无厌.
到目前为止尚未提出的两种替代方法是仅使用其他工具进行这种匹配/提取.
您可以使用参数perl作为sed的替代品-pe.它支持?非贪婪修饰符:
$ perl -pe 's/.*?NUM://' data.txt
09011111111 bla bla bla bla NUM:08022222222 bla bla bla
Run Code Online (Sandbox Code Playgroud)
您可以使用-oGNU grep选项来仅获取与正则表达式匹配的数据位:
$ egrep -o 'NUM:[0-9]*' data.txt
NUM:09011111111
NUM:08022222222
Run Code Online (Sandbox Code Playgroud)