Я знаю, что мы можем избежать специального символа, такого как *(){}$
с, \
чтобы считаться литералами.
Например \*
или\$
Но в случае .
я должен сделать это дважды, в \\.
противном случае это считается специальным персонажем. Пример:
man gcc | grep \\.
Почему это так?
shell-script
grep
regular-expression
quoting
escape-characters
зарегистрированный пользователь
источник
источник
man bash|grep \\.
может быть примером.man gcc | grep '\.'
.Ответы:
Как правило, вам нужно всего один раз сбежать, чтобы сделать специальный символ буквальным. Иногда вам приходится делать это дважды, потому что ваш шаблон используется более чем одной программой.
Давайте обсудим ваш пример:
Эта команда интерпретируется двумя программами,
bash
интерпретатором иgrep
. Первая причина побегаbash
знает\
буквально, так что вторая - пропускgrep
.Если вы убегаете только один раз,
\.
,bash
будет знать это точка является буквальным, и перейти.
кgrep
. Когдаgrep
видишь это.
, он думает, что точка - это специальный символ, а не буквальный.
Если бежать в два раза,
bash
будет проходить шаблон\.
дляgrep
. Теперьgrep
знайте, что это буквальная точка.источник
grep \\. my_file
. Командная строка интерпретируется оболочкой, используя первую\
для экранирования, а вторая\
передается буквально в grep. Точка.
не является особенной для оболочки, поэтому она все равно передается дословно. Grep затем читает (одиночный)\
и использует его, чтобы избежать точки.
.echo .
в баше просто ... перекликается с.
характером баха .