Как исключить часть совпадающей строки из замены? - PullRequest
1 голос
/ 01 апреля 2020

Допустим, я хочу изменить все слова, оканчивающиеся на -et, чтобы они вместо оканчивались на -ert

. Простое выполнение sed 's/et /ert /g' сработало бы для всех слов, за которыми следует другое слово. Но только если за ним следует пробел. За ним также могут следовать «.», «,», «:» Или другие символы. Запуск sed для каждого отдельного случая не кажется правильным.

Я ищу что-то вроде "для каждого совпадения AB, замените A на C, но не коснуться B ".

Уточнение по комментариям:

Не ограничивается окончанием слов. Я хотел бы сделать это и в словах. Например:

$ echo "aaetxaa" | sed '?'
aaertxaa
$ echo "aaetyaa" | sed '?'
aaetyaa

Таким образом, замена произошла только тогда, когда сопоставление закончилось знаком x, а не y.

1 Ответ

2 голосов
/ 02 апреля 2020

Я предполагаю, что вы хотите сопоставить et, только если за ним следует x или конец строки.

В этом случае вы можете использовать

sed -E 's/et(x|$)/ert\1/g'

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

echo "aaetxaa" | sed -E 's/et(x|$)/ert\1/g'
# => aaertxaa
echo "aaetyaa" | sed -E 's/et(x|$)/ert\1/g'
# => aaetyaa

Подробности

  • -E - Синтаксис POSIX ERE включен
  • s/ - команда подстановки, / - разделитель
  • et(x|$) - LHS: et, за которым следует либо x, либо конец строки, захваченный в группу 1
  • ert\1 - ert и значение группы 1
  • g - глобальный флаг: сопоставить и заменить все вхождения в строке.
...