我想从一些文本中提取一个子字符串,我正在努力寻找能够为我做的正确的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但是其他任何东西都给出了完整的输入字符串。
答案 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