使用正则表达式搜索并删除

使用正则表达式搜索并删除

如何在 bash 中使用正则表达式来搜索任何给定的字符串并删除特定单词的出现?这是我想出的表达方式

^([A-Za-z-]+)(-).*(el6.*)$

我想要完成的是,在给定的字符串中,如cjkuni-ukai-fonts-0.2.20080216.1-35.el6.noarch,表达式应删除cjkuni-ukai-fonts-and el6.noarch,并仅保留0.2.20080216.1-35。由于我可以在系统上安装的内容非常有限,因此我无法使用 perl 或其他非基本命令。任何帮助,将不胜感激。

PS:我尝试过 sed,但无法使其工作。

答案1

如果您确实必须在纯 bash 中执行此操作:

$ foo="cjkuni-ukai-fonts-0.2.20080216.1-35.el6.noarch"
$ [[ $foo =~ [0-9.]+-[0-9]* ]] && echo $BASH_REMATCH
0.2.20080216.1-35

如果您对解决方案感到满意sed

$ sed 's/.*-\([0-9.]*-[0-9]*\).*/\1/' <<<$foo
0.2.20080216.1-35

如果您有权访问 GNU grep,您还可以执行以下操作:

$ grep -oE -- '[0-9.]+-[0-9]*' <<<$foo
0.2.20080216.1-35

或者

$ grep -oP -- '[.\d]+-\d+' <<<$foo
0.2.20080216.1-35

最后,由于您运行的是 CentOS 系统,因此安装 Perl 是相当安全的,所以您也可以这样做:

$ perl -pe 's/.*?([0-9.]+-[0-9]*).*/$1/' <<<$foo
0.2.20080216.1-35

相关内容