Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed和/或grep的正则表达式_Regex_Linux_Unix_Sed_Grep - Fatal编程技术网

Regex 使用sed和/或grep的正则表达式

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的/[^\.]\+\./' 提前谢谢 您也可以使用剪

如何使用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的/[^\.]\+\./'

提前谢谢

您也可以使用剪切:

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这很酷,感谢您的详细解释和他们之间的差异。这是非常好的信息。