Используйте другой разделитель, т.е. #
sed -i s#"< network>"#"192.168.61.0/24"#g file.sh
Или Escape /
sed -i s/"< network>"#"192.168.61.0\/24"/g file.sh
в соответствии с руководством Bash, это называется ANSI-C цитируют . Руководство говорит:
слова формы $ 'String' обрабатываются специально. Слово расширяется до строки, с помощью обратной косой черты, сменившимися символами, как указано стандартом ANSI C.
На практике это означает, что '\ T'
не будет расширена в вкладку символом, но $ '\ T'
будет. Выходной выход должен быть эквивалентен с использованием echo -e
, но можно использовать где угодно, вы бы использовали строку без необходимости замены команды .
Утилиты, такие как GNU SED, выполняют свое собственное расширение эвакулярных символов, но GNU Greep не делает. Bash Shell, не GREP, расширяется сбежавшие символы в рамках цитируемых строк ANSI-C. Без цитирования ANSI-C регулярное выражение, которое вы разместили, не содержит символов вкладок для соответствия входу.
Первая строка работает, если вы оставляете ^
. Может быть, это сработало, но это не сработало, как вы предполагали? Сомневаюсь, что поведение GREP
изменилось в такой важной точке.
ECHO
не переводит escape последовательности по умолчанию. Вам нужны -E
для этого. Похоже с оболочкой. Вам нужно $ '...' ... '
, чтобы оболочка использовать escape последовательности.
Вы, наверное, должны понимать, что не существует единого типа регулярных выражений. Существуют как минимум основные регулярные выражения
или BRE
(иногда только RE
), расширенные регулярные выражения
или ERE
и perl совместимые регулярные выражения
или PCRE
. Все эти языки используют несколько разный синтаксис. Текущие версии GNU grep
поддерживают все три, а BRE
- по умолчанию. Для ERE
необходимо использовать опцию -E
, а для PCRE
-P
. Ваш пример будет работать только с -P
, так как при использовании основного и расширенного RE обратный слеш теряет свое значение, а [\t]
совпадает либо с обратным слешем, либо с символом t. Вероятно, вы использовали этот шаблон на каком-то другом языке, поддерживающем PCRE
по умолчанию, что имеет смысл, так как это самая мощная версия. Или, возможно, у вас где-то был псевдоним grep='grep -P'
.