And*_*rew 10 grep sed awk text-processing
我有一个看起来像这样的文件:
asd 123 aaa wrqiqirw 123
123 itiewth 123 asno 123
123 132 123 123 123
boagii 123 asdnojaneoienton 123
Run Code Online (Sandbox Code Playgroud)
预期输出为:
123
123
123
123
Run Code Online (Sandbox Code Playgroud)
我需要通过正则表达式搜索模式。有没有办法实现这样的事情?
Sté*_*las 11
随着pcregrep,具有类似的模式12*3:
pcregrep -o1 '(12*3).*'
Run Code Online (Sandbox Code Playgroud)
使用pcregrep或 GNU grep -P:
grep -Po '^.*?\K12*3'
Run Code Online (Sandbox Code Playgroud)
(pcregrep处理字节多于字符,而 GNU grep 将处理当前语言环境中定义的字符(并且您必须确保输入包含当前语言环境中的有效文本))。
请注意,grep如果模式与空字符串匹配,GNU将不会打印任何内容。
在 Perl 中,简单地说
perl -lne 'print $& if /\d+/' inputfile
Run Code Online (Sandbox Code Playgroud)
或来自标准输入:
echo foo 123 bar 456 doo 789 | perl -lne 'print $& if /\d+/'
123
Run Code Online (Sandbox Code Playgroud)
正则表达式\d+将匹配任何连续数字的字符串,并$&引用匹配的字符串。
正面:
LC_ALL=C sed -e 's/.*\(123\).*/\1/' <file
Run Code Online (Sandbox Code Playgroud)
LC_ALL-Csed如果文件包含当前区域设置中的无效字符,此处需要防止崩溃或产生意外结果。
它还在一行中生成一个条目,但匹配最后一个,而不是第一个。
为了匹配第一个,使用 ast-open 的 sed,其 ERE 支持 Perl 风格的*?非贪婪重复运算符:
LC_ALL=C sed -E 's/.*?(123).*/\1/'
Run Code Online (Sandbox Code Playgroud)
(-E对于扩展 RE 将在 POSIX 的下一版本中)