仅打印与正则表达式匹配的部件

时间:2012-03-07 12:47:15

标签: regex bash sed grep

echo "a b _c d _e f" | sed 's/[ ]*_[a-z]\+//g'

结果为a b d f

现在,我怎么能把它翻过来,只打印_c _e,而不假设线的其余部分?

3 个答案:

答案 0 :(得分:17)

如果问题是“如何使用sed仅打印与特定正则表达式匹配的子字符串?”那么实现起来真的很难(而不是一个明显的解决方案)。

在这种情况下,

grep会更有帮助。 -o选项在单独的行上打印每个匹配的部分,-P启用PCRE正则表达式语法:

$> echo "a b _c d _e f" | grep -o -P "(\ *_[a-z]+)"
 _c
 _e

最后

$> echo `echo "a b _c d _e f" | grep -o -P "(\ *_[a-z]+)"`
_c _e

答案 1 :(得分:5)

确定您想要的模式,由您不想要的模式包围,并仅发出:

echo "a b _c d _e f" | sed 's/[^_]*\s*\(_[a-z]\)[^_]*/\1 /g'

输出:

_c _e 

答案 2 :(得分:1)

hacky 但你可以将它用于仅限sed的版本:

echo "a b _c d _e f" | sed 's/ /\
/g' | sed -n '/_[a-z]/p'

<强>输出:

_c
_e