我想找到一种简单的方法来提取字符串中直到第一个数字出现的部分(可能使用正则表达式而不是逐个字符地遍历字符串)。我正在使用它来提取rpm -qa
没有版本的包名称。例如:
Parsing: perl-Text-ParseWords-3.30-1.fc22.i686
Result: perl-Text-ParseWords
答案1
首选替代方案
我们可以简单地修改rpm查询仅输出名称。
rpm -qa --queryformat "%{NAME}\n"
或者我们可以用正则表达式弄脏
不完全是“直接”,但这里有一个 sed 正则表达式应该能够做到这一点。
sed -e 's/\([^\.]*\).*/\1/;s/-[0-9]*$//' <<< "perl-Text-ParseWords-3.30-1.fc22.i686"
这应该可以处理除包名称中包含句点之外的所有内容(我什至认为这是不允许的)。
快速分解
s/\([^\.]*\).*/\1/
在第一节课之前抓住一切。于是就perl-Text-ParseWords-3.30-1.fc22.i686
变成了perl-Text-ParseWords-3
s/-[0-9]*$//
去掉尾随-
和第一个版本数字。于是就perl-Text-ParseWords-3
变成了perl-Text-ParseWords
。
答案2
直接在bash中:
a='perl-Text-ParseWords-3.30-1.fc22.i686'
r='(^[^0-9]+)'
[[ $a =~ $r ]]
echo "${BASH_REMATCH[1]%?}"