Почему мое выражение GREP должно использовать $ 'строка' для соответствия символам табуляции?

Используйте другой разделитель, т.е. #

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

6
16.11.2014, 05:43
3 ответа

ANSI-C цитируют

в соответствии с руководством Bash, это называется ANSI-C цитируют . Руководство говорит:

слова формы $ 'String' обрабатываются специально. Слово расширяется до строки, с помощью обратной косой черты, сменившимися символами, как указано стандартом ANSI C.

На практике это означает, что '\ T' не будет расширена в вкладку символом, но $ '\ T' будет. Выходной выход должен быть эквивалентен с использованием echo -e , но можно использовать где угодно, вы бы использовали строку без необходимости замены команды .

Утилиты, такие как GNU SED, выполняют свое собственное расширение эвакулярных символов, но GNU Greep не делает. Bash Shell, не GREP, расширяется сбежавшие символы в рамках цитируемых строк ANSI-C. Без цитирования ANSI-C регулярное выражение, которое вы разместили, не содержит символов вкладок для соответствия входу.

9
27.01.2020, 20:24

Первая строка работает, если вы оставляете ^ . Может быть, это сработало, но это не сработало, как вы предполагали? Сомневаюсь, что поведение GREP изменилось в такой важной точке.

ECHO не переводит escape последовательности по умолчанию. Вам нужны -E для этого. Похоже с оболочкой. Вам нужно $ '...' ... ', чтобы оболочка использовать escape последовательности.

0
27.01.2020, 20:24

Вы, наверное, должны понимать, что не существует единого типа регулярных выражений. Существуют как минимум основные регулярные выражения или BRE (иногда только RE), расширенные регулярные выражения или ERE и perl совместимые регулярные выражения или PCRE. Все эти языки используют несколько разный синтаксис. Текущие версии GNU grep поддерживают все три, а BRE - по умолчанию. Для ERE необходимо использовать опцию -E, а для PCRE -P. Ваш пример будет работать только с -P, так как при использовании основного и расширенного RE обратный слеш теряет свое значение, а [\t] совпадает либо с обратным слешем, либо с символом t. Вероятно, вы использовали этот шаблон на каком-то другом языке, поддерживающем PCRE по умолчанию, что имеет смысл, так как это самая мощная версия. Или, возможно, у вас где-то был псевдоним grep='grep -P'.

1
27.01.2020, 20:24

Теги

Похожие вопросы