sed заменяет точную строку, содержащую скобки - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь заменить точную строку, содержащую скобку. скажем: от aa до bbb, просто для примера.

Я использовал следующее регулярное выражение:

sed  's|\<a\[aa]\>|bbb|g' testfile

, но, похоже, оно не работает. это может быть что-то действительно базовое c, но я не смог заставить его работать, поэтому я был бы признателен за любую помощь в этом.

1 Ответ

0 голосов
/ 28 февраля 2020

Вам необходимо удалить границу завершающего слова, для которой требуется буква, di git или _, чтобы сразу следовать за символом ].

sed 's|\<a\[aa]|bbb|g' file

См. онлайн sed демо :

s="say: a[aa] to bbb, not ba[aa]"
sed 's|\<a\[aa]|bbb|g' <<< "$s"
# => say: bbb to bbb, not ba[aa]

Вы также можете потребовать несловарный символ с захватом сгруппировать и заменить на обратную ссылку:

sed -E 's~([^_[:alnum:]]|^)a\[aa]([^_[:alnum:]]|$)~\1bbb\2~g' file

Здесь ([^_[:alnum:]]|^) захватывает любой несловарный символ или начало строки в Группе 1, а ([^_[:alnum:]]|$) сопоставляет и захватывает в Группе 2 любой символ, кроме _, di git или буква, а заполнители \1 и \2 восстанавливают эти значения в результате. Это, однако, не разрешает последовательные матчи, поэтому вы все равно можете использовать \< до a, чтобы проиграть: sed -E 's~\<a\[aa]([^_[:alnum:]]|$)~bbb\1~g'. file`.

См. это онлайн-демо .

Для обеспечения пробелов вы можете использовать

sed -E 's~([[:space:]]|^)a\[aa]([[:space:]]|$)~\1bbb\2~g' file

Или, в вашем случае, достаточно только конечной границы пробела:

sed -E 's~\<a\[aa]([[:space:]]|$)~bbb\1~g' file
...