如何在 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