Regex 使用sed和/或grep的正则表达式
如何使用sed或grep显示所查询rpm包的arch和版本Regex 使用sed和/或grep的正则表达式,regex,linux,unix,sed,grep,Regex,Linux,Unix,Sed,Grep,如何使用sed或grep显示所查询rpm包的arch和版本 [root@kitchen-vm-centos6-box boot]# rpm -qa | grep kernel-devel kernel-devel-2.6.32-642.11.1.el6.x86_64 kernel-devel-2.6.32-696.10.2.el6.x86_64 我只需要: 2.6.32-642.11.1.el6.x86_64 我的sed缺少什么?=>sed的/[^\.]\+\./' 提前谢谢 您也可以使用剪
[root@kitchen-vm-centos6-box boot]# rpm -qa | grep kernel-devel
kernel-devel-2.6.32-642.11.1.el6.x86_64
kernel-devel-2.6.32-696.10.2.el6.x86_64
我只需要:
2.6.32-642.11.1.el6.x86_64
我的sed缺少什么?=><代码>sed的/[^\.]\+\./'
提前谢谢 您也可以使用剪切:
rpm -qa | grep kernel-devel | cut -d \- -f 3-4
您可以这样使用
sed
,避免额外的grep
:
rpm -qa | sed '/kernel-devel/s/^[^0-9]*//'
2.6.32-642.11.1.el6.x86_64
2.6.32-696.10.2.el6.x86_64
$ rpm -qa | grep -oP "devel-\K(.*)"
2.6.32-642.11.1.el6.x86_64
2.6.32-696.10.2.el6.x86_64
您的
sed
删除第一个“2”后的第一个点,因为它与您提供的正则表达式匹配
通过使正则表达式更显式,您可以轻松地进行修复
其他答案已经提出了解决方案,下面是另一个使用grep
:
rpm -qa | sed '/kernel-devel/s/^[^0-9]*//'
2.6.32-642.11.1.el6.x86_64
2.6.32-696.10.2.el6.x86_64
$ rpm -qa | grep -oP "devel-\K(.*)"
2.6.32-642.11.1.el6.x86_64
2.6.32-696.10.2.el6.x86_64
\K
告诉引擎假装匹配尝试从这个位置开始(这是Perl为查找建议的替代方法)。您只能使用grep执行:
rpm -qa | grep -P -o '(?<=kernel-devel-).*'
说明:
匹配字符串的开头^
匹配字符串开头的非点、非数字字符。这是我们不需要的部分[^.0-9]
- sed命令的
结尾用空字符串替换匹配的部分//g
- awk中的一个:
$ rpm -qa | awk 'match($0,/^kernel-devel-./){print substr($0,RLENGTH)}'
2.6.32-642.11.1.el6.x86_64
2.6.32-696.10.2.el6.x86_64
解释:
match($0,/^kernel-devel-./) { # if the record starts with kernel-devel-[ANYTHING]
print substr($0,RLENGTH) # print starting from the [ANYTHING]
}
你的sed适合我。你能显示你得到的输出,以及你尝试的完整命令行吗?酷!有帮助!,如何仅打印输出结果的第一行?@OutcastG add
|head
啊,我可以使用head。。让我试试。。非常感谢@andreas Hofmann这很酷,感谢您的详细解释和他们之间的差异。这是非常好的信息。