如何仅打印每行的第一个匹配项?

如何仅打印每行的第一个匹配项?

我有一个如下所示的文件:

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

相关内容