在 Bash 中将字符串提取到第一个数字

Lin*_*ner 2 bash string shell-script

我想找到一种简单的方法来提取字符串的一部分,直到第一个数字出现的位置(可能使用正则表达式而不是逐个字符遍历字符串)。我正在使用它来从rpm -qa没有版本的情况下提取包名称。例如:

Parsing: perl-Text-ParseWords-3.30-1.fc22.i686
Result: perl-Text-ParseWords
Run Code Online (Sandbox Code Playgroud)

Zac*_*ady 5

首选替代方案

我们可以简单地修改 rpm 查询以仅输出名称。

rpm -qa --queryformat "%{NAME}\n"
Run Code Online (Sandbox Code Playgroud)

或者我们可以用正则表达式弄脏

不完全是“直截了当”,但这里有一个 sed 正则表达式,应该能够做到这一点。

sed -e 's/\([^\.]*\).*/\1/;s/-[0-9]*$//' <<< "perl-Text-ParseWords-3.30-1.fc22.i686"
Run Code Online (Sandbox Code Playgroud)

这应该处理所有事情,除了包名中有一个句点(我什至认为这是不允许的)。

快速分解

  • s/\([^\.]*\).*/\1/在第一期之前抓住一切。于是perl-Text-ParseWords-3.30-1.fc22.i686变成perl-Text-ParseWords-3

  • s/-[0-9]*$//摆脱那个尾随-和第一个版本数字。于是perl-Text-ParseWords-3变成perl-Text-ParseWords