[英]Get only one instance of a regex instead of multiple
我有一个包含以下内容的文本文件:
libpackage-example1.so.3.2.1,
libpackage-example2.so.3.2.1,
libpackage-example3.so.3.2.1,
libpackage-example4.so.3.2.1
我只想得到一个“3.2.1”的实例,但是当我运行下面的命令时:
grep -Po '(?<=.so.)\d.\d.\d'
结果是
3.2.1
3.2.1
3.2.1
3.2.1
而不仅仅是一个“3.2.1”。 我认为将其设为懒惰的正则表达式会起作用,但我不知道该怎么做。
正则表达式应用于每一行。 无论您如何更改正则表达式,如果整个文件包含多个匹配行,那么所有这些都将被打印出来。
但是,您可以使用-m
选项限制匹配行的数量。 -o -m 1
将在退出前最多匹配一行中的所有匹配项 output。 如果一行中有多个匹配项,请使用grep... | head -n1
grep... | head -n1
代替。
另外,请记住.
表示任何字符。 要指定文字点,请使用\.
或[.]
。
Perl 正则表达式还支持\K
,这使得编写更容易。 仅打印最后一个\K
之后的部分。
grep -Pom1 '\.so\.\K\d\.\d\.\d'
grep 命令有-m N
选项,这将使 grep 在前 N 个匹配后停止。
一般情况下,只获取unix中的第一行output的方法是将output发送给head
命令。 要仅获取 output 的第一行,请执行以下操作:
grep -Po '(?<=.so.)\d.\d.\d' | head -n 1
那个“1”可以是任何数字。
采用
awk -F'[.]so[.]' '/^libpackage-/{sub(/,$/,"", $NF);print $NF; exit}'
与.so.
分隔符,找到以libpackage-
开头的行,从最后一个字段的末尾删除一个逗号,打印它并停止处理。
其它的办法:
grep -m1 -Po '(?<=\.so\.)\d+\.\d+\.\d+'
-m1
获取第一个实例。 我更新了表达式:文字句点应该被转义, \d+
将匹配一个或多个数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.