Вам необходимо удалить границу завершающего слова, для которой требуется буква, 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