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
平台为 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