繁体   English   中英

只获取一个正则表达式实例而不是多个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM