Заменить совпадение между словом char или концом строки на sed

Я всегда предпочитаю awk:

awk -F"|" '{ if ($2~/me/) { print $4 } }' myfile.txt
0
21.03.2021, 15:04
2 ответа

Во-первых, вы пытаетесь использовать расширенные регулярные выражения (ERE ), но Sed по умолчанию использует базовые регулярные выражения (BRE ). А именно, ()для группировки и +для «одного или нескольких» — это ERE. Подробнее см. . Почему мое регулярное выражение работает в X, но не в Y? . Для активации ERE используйте флаг -E(, но для решения )он нам не понадобится.

Даже этого было бы недостаточно, потому что вы также соответствуете comment:(\w+), но

  • Вы не -вводите comment:. Поместите его в слот замены.
  • Будучи \wрасширением GNU для соответствия словесным символам, (\w+)не является «всем до следующего ;», как утверждается в вопросе, это было бы [^;]*.

Решение

sed 's/comment:[^;]*/comment:bar/g'
2
28.04.2021, 22:58

вы можете использовать группу и вызвать с помощью нумерации, для замены yyy на xxx путем группировки:

$ echo "foo yyy bar" | sed 's/\(foo\).*\( bar\)/\1 xxx \2/'  
foo xxx bar

в вашем случае:

sed "s/\(comment:\).*\(sometag\)/\1bar\2/g" <<< $s
-1
28.04.2021, 22:58

Теги

Похожие вопросы