Найти и заменить, но не рядом с буквой или цифрой - PullRequest
0 голосов
/ 11 декабря 2011

С sed я могу заменить один предмет другим. E.g.:

sed -i "s/a/b/g" file

Однако бывают случаи, когда я не хочу, чтобы эта замена произошла. Как я могу гарантировать, что замена происходит только тогда, когда:

  • Символ непосредственно перед ним не является буквой, цифрой или {.
  • Символ сразу после не является буквой или цифрой, или }.

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Вот один из способов:

% echo '2a: {a} a cat.' | sed -e 's/\([^{[:alnum:]]\)a\([^}[:alnum:]]\)/\1b\2/g'
2a: {a} b cat.

Группы форм \(...\), которые сохраняются и используются в подстановке, ссылаются на \1, \2, ... \9.

0 голосов
/ 11 декабря 2011
sed -r -e "s/([^0-9a-zA-Z\{])a([^0-9a-zA-Z\}])/\1b\2/g"

([^0-9a-zA-Z\{]) - первая подобранная группа символов (длина 1 в текущем случае). Ни число (0-9), ни буква (a-zA-Z), ни буква {(\{).

([^0-9a-zA-Z\}]) - вторая подобранная группа, как и первая.

Если мы сопоставили эти последовательности, мы заменили его первой группой (\1), b и второй группой (\2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...