Почему эти регулярные выражения разные?

Я ищу строки, в которых есть апостроф, и пробовал несколько выражений, которые показались мне идентичными; однако некоторые работали, а другие нет. Почему я получил следующее поведение:

egrep \' file      # works as expected

egrep "\'" file    # seems to return all lines

egrep "[\']" file  # works as expected

egrep '\'' file    # seems to be waiting for more input

person bqui56    schedule 28.07.2012    source источник


Ответы (2)


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

$ echo egrep \' file
egrep ' file
$ echo egrep "\'" file
egrep \' file
$ echo egrep "[\']" file
egrep [\'] file
$ echo egrep '\'' file
>

В последнем случае требуется больше ввода, потому что вы все еще находитесь внутри выражения в одинарных кавычках: это не экранированная кавычка (\') в одинарных кавычках (поскольку это не то, как вы экранируете одинарные кавычки). Это обратная косая черта между одинарными кавычками. , с завершающей открывающей кавычкой.

Между прочим, чтобы избежать одинарной кавычки в строке с одинарными кавычками, используйте такую ​​конструкцию:

$ echo 'foo'\''bar'
foo'bar

Что это на самом деле делает, так это помещает голую литеральную кавычку (\') между двумя строками в одинарных кавычках. Затем все они неявно объединяются вместе.

Я понятия не имею, почему "\'" соответствует всем строкам (но это действительно так).

person phs    schedule 28.07.2012
comment
ваша формулировка немного вводит в заблуждение: экранирование с [...] кавычками звучит так, как будто вы используете кавычки для экранирования. хорошее предложение относительно: использовать echo, чтобы разобраться, что происходит - person pb2q; 28.07.2012
comment
Как бы вы экранировали символ в одинарных кавычках? - person bqui56; 28.07.2012

Я думаю, что вы слишком усложняете это, если вы пытаетесь сопоставить ', процитируйте это в ":

echo "'" | grep "'"
person Thor    schedule 28.07.2012