Я всегда предпочитаю awk:
awk -F"|" '{ if ($2~/me/) { print $4 } }' myfile.txt
Во-первых, вы пытаетесь использовать расширенные регулярные выражения (ERE ), но Sed по умолчанию использует базовые регулярные выражения (BRE ). А именно, ()
для группировки и +
для «одного или нескольких» — это ERE. Подробнее см. . Почему мое регулярное выражение работает в X, но не в Y? . Для активации ERE используйте флаг -E
(, но для решения )он нам не понадобится.
Даже этого было бы недостаточно, потому что вы также соответствуете comment:(\w+)
, но
comment:
. Поместите его в слот замены. \w
расширением GNU для соответствия словесным символам, (\w+)
не является «всем до следующего ;
», как утверждается в вопросе, это было бы [^;]*
. Решение
sed 's/comment:[^;]*/comment:bar/g'
вы можете использовать группу и вызвать с помощью нумерации, для замены yyy на xxx путем группировки:
$ echo "foo yyy bar" | sed 's/\(foo\).*\( bar\)/\1 xxx \2/'
foo xxx bar
в вашем случае:
sed "s/\(comment:\).*\(sometag\)/\1bar\2/g" <<< $s