我有一个文本文件,其中包含:
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+
将匹配一个或多个数字。