Печатать только те части, которые соответствуют регулярному выражению

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

Результат будет a b d f.

Теперь, как я могу повернуть его и напечатать только _c _e, не принимая ничего о остальной части строки?

Ответ 1

Если возникает вопрос: "Как напечатать только подстроки, которые соответствуют определенному регулярному выражению, используя 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

Ответ 2

Определите нужные вам шаблоны, окруженные шаблонами, которые вы не хотите, и испускайте только те:

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

ВЫВОД:

_c _e 

Ответ 3

Его взломанный, но вы можете использовать его для версии sed:

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

ВЫВОД:

_c
_e