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



我有一个文本文件,其中包含:

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将在退出前最多输出一行中的所有匹配项。如果一行中有多个匹配,则使用grep ... | head -n1

还要记住,.表示任何字符。要指定文字点,请使用.[.]

Perl正则表达式也支持K,这使得编写更容易。只打印最后一个K之后的部分。

grep -Pom1 '.so.Kd.d.d'

grep命令有-m N选项,它将使grep在第一个N匹配后停止。

一般来说,在unix中只获得第一行输出的方法是将输出发送到head命令。要只获得第一行输出,执行:

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+将匹配一个或多个数字。

相关内容

最新更新