sed 字符 类, [:alpha:] 似乎匹配一个数字

sed character classes, [:alpha:] appears to match a digit

平台为 Centos 7

我正在努力提取文件名的非版本部分,但对这个结果感到困惑:

echo "xorg-x11-font-utils-7.5-21.el7.x86_64.rpm" | sed -nr "s/([[:alpha:]]+)-[0-9].*\.*rpm//p"

产生

xorg-x11-font-utils

因此 [:alpha:]+ 似乎匹配包含两个 *1* 的字符串,两个非字母字符。我原以为这根本不匹配。

解释?

([[:alpha:]]+)-[0-9] 匹配字符串中的 utils-7。当您替换为 </code> 时,它会变成 <code>utils.

之前的所有内容(即xorg-x11-font-)保持不变。

工作原理:

</code> 是对第 1 组的反向引用,它包含第 1 组中匹配的内容,在本例中 <code>utils-[0-9] 匹配紧随其后的 -7 utils,然后,.*\.*rpm 匹配字符串的其余部分。

替换将整个匹配 utils-7.5-21.el7.x86_64.rpm 替换为第 1 组 utils 的内容,所以最后你得到:

  • 字符串开头xorg-x11-font-,不变
  • 替换为utils的其余字符串
  • 最后:xorg-x11-font-utils

你会找到解释 here