用bash从文本中抓取子字符串

时间:2014-04-11 10:19:44

标签: regex bash sed

我想从一些文本中提取一个子字符串,我正在努力寻找能够为我做的正确的sed或正则表达式。

我的输入文字可能是以下之一

feature/XXX-9999-SomeOtherText
develop
feature/XXX-99999-SomeMoreText
bugfix/XXX-9999
feature/XXXX-9999
XXX-9999

我想拉出XXX-9999,但可以有任意数量的X和9。没有X或9的地方(根据第二个例子)我想返回一个空值。

我尝试了几种使用sed的方法,而我得到的最接近的是

echo "feature/XXX-9999-SomeOtherText" | sed 's/.*\([[:alpha:]]\{3\}-[[:digit:]]\{4\}\).*/\1/'

如果有3个X和4个9但是其他任何东西都给出了完整的输入字符串。

4 个答案:

答案 0 :(得分:0)

您可以使用grep及其-o选项:

grep -o 'X\+-9\+'

如果您希望不匹配的行导致空行,您可以添加|| echo ''

答案 1 :(得分:0)

您可以使用此sed

sed 's#\(^\|.*/\)\([a-Z0-9]\+-[0-9]\+\).*#\2#g; /[a-zA-Z0-9]\+-[0-9]\+/!s#.*##g' yourfile

答案 2 :(得分:0)

echo "feature/XXX-9999-SomeOtherText\nnoX nor 9" | sed 's/.*\([[:alpha:]]\{1,\}-[[:digit:]]\{1,\}\).*/\1/
t
s/.*//'

您使用在测试{3}中修复的计数,因此任何数量的X等于或大于等于但不能更少。将其更改为最小{1,}(相当于GNU sed的+)。 我还将非容器添加到空行(不删除行),如果不需要,删除fom t直到最后/

答案 3 :(得分:0)

运行您发布的示例输入文件:

$ sed -r -n 's/[^X]*(X+-9+).*/\1/p' file
XXX-9999
XXX-99999
XXX-9999
XXXX-9999
XXX-9999

$ sed -r -n 's/[^X]*(X+-9+)?.*/\1/p' file
XXX-9999

XXX-99999
XXX-9999
XXXX-9999
XXX-9999

上述恕我直言,展示了对where there are no Xs or 9s (as per the second example) I would like to return an empty value的几种最可能的解释。

如果您的sed不支持-r,那么这适用于任何sed:

sed -n 's/[^X]*\(XX*-99*\).*/\1/p' file
sed -n 's/[^X]*\(XX*-99*\)*.*/\1/p' file