Печатать только те части, которые соответствуют регулярному выражению - PullRequest
15 голосов
/ 07 марта 2012

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

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

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

Ответы [ 3 ]

18 голосов
/ 07 марта 2012

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

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

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

ВЫВОД:

_c _e 
1 голос
/ 07 марта 2012

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

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

ВЫХОД:

_c
_e
...