我有一个如下所示的文件:
asd 123 aaa wrqiqirw 123
123 itiewth 123 asno 123
123 132 123 123 123
boagii 123 asdnojaneoienton 123
预期输出是:
123
123
123
123
我需要通过正则表达式搜索模式。有什么方法可以实现这样的事情吗?
答案1
与pcregrep
, 具有如下模式12*3
:
pcregrep -o1 '(12*3).*'
使用pcregrep
或 GNU grep -P
:
grep -Po '^.*?\K12*3'
(pcregrep
适用于字节多于字符,而 GNU grep 将适用于当前语言环境中定义的字符(并且您必须确保输入包含当前语言环境中的有效文本))。
grep
请注意,如果模式与空字符串匹配,GNU将不会打印任何内容。
答案2
在 Perl 中,简单地说
perl -lne 'print $& if /\d+/' inputfile
或来自标准输入:
echo foo 123 bar 456 doo 789 | perl -lne 'print $& if /\d+/'
123
正则表达式\d+
将匹配任何连续数字的字符串,并$&
引用匹配的字符串。
答案3
只需一个 grep 就足以123
在每一行中引入匹配项。
无论比赛是第一场、中间场还是最后一场比赛,都没有意义。
如果你要求 123,如果它在队列中,你会得到 123(除非你的问题没有正确表达并且你需要不同的东西)
$ grep -wo '123' file # -w: word match -o : return only matched string instead of the whole line (default grep operation)
如果您需要使用正则表达式捕获每行的第一个数字(任何数字 - 任何长度),那么这将完成这项工作:
cat <<EOF >file1
asd 111 777 aaa wrqiqirw 123
333 123 itiewth 123 asno 123
4444 111 123 123 567
boagii what 666 asdnojaneoienton 123
EOF
grep -Po '^[0-9]+|^.*?\K[0-9]+' file1
#output
111
333
4444
666
答案4
sed -e '
/\n/{P;d;}
s/12*3/\n&\n/;D
' < inoutfile