Как экранировать <или> в параметре в оболочке?


10

Я хотел бы использовать grepс выражением PCRE, которое содержит <символ. Баш думает, что я хочу перенаправить, но я не хочу. Как я могу сбежать <?

Ответы:


11

Я смог сделать это с обратной косой чертой:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

Процитированный менее чем, и процитированный, обратный слэш меньше, чем оба дали глупые ответы.


5
Да, или поместите это в одинарные кавычки
Гленн Джекман

Мне все еще нужно узнать, например, как это работает с экранированием: например grep -oP '(?< )(.*)$', не работает с одинарными кавычками. Попробовал сначала.
Хакре

@hakre Кажется, в вашем регулярном выражении есть синтаксическая ошибка. Вы имели в виду (?<! )(.*)$или (?<= )(.*)$?
Жиль "ТАК - перестань быть злым"

4

Два простых правила:

  • Обратная косая черта \Cэкранирует следующий символ, независимо от новой строки.
  • Одинарные кавычки 'text'экранируют любой символ между ними, включая обратную косую черту, но не включают в себя одинарные кавычки (так как они отмечают конец текста в кавычках).

Таким образом:

grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile

Если вам нужно передать аргумент, содержащий одинарные кавычки, вы можете использовать '\''«экранирование» одинарных кавычек внутри одинарных кавычек. Технически, это то, что заканчивается первым литеральным текстом, затем помещает литерал 'в то же самое слово, затем более литеральный текст все еще в том же слове.

grep '^D'\''oh!' myfile

Остальные правила цитирования (суммированы):

  • Вы должны заключать в кавычки следующие символы хотя бы в некоторых случаях: пробел и !"#$&'()*;<>?[\]^`{|}~(другими словами, следующие символы безопасны: буквы, цифры %+,-./:=@_и не-ASCII символы).
  • Между двойными кавычками все символы используются буквально, кроме "$\`и (в оболочках с включенной историей) !. Обратная косая черта между двойными кавычками будет появляться в строке, если она не предшествует одному из не-литеральных символов.

Эти правила относятся к bash и другим оболочкам в стиле Bourne (например, ash и ksh). Они также применимы к zsh (за исключением того, что =после пробела может потребоваться цитирование). Правила в csh / tcsh и в Fish различны.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.