Чому я повинен уникнути "крапки" двічі?


13

Я знаю , що ми можемо уникнути особливий характер , як *(){}$з \тим, щоб бути розглянуті літерали.
Наприклад \*або\$

Але якщо .мені доведеться це зробити двічі, як \\.інакше це вважається особливим персонажем. Приклад:

man gcc | grep \\.

Чому так?


Чи можете ви дати справу, що вам доведеться втекти двічі?
cuonglm

man bash|grep \\.може бути прикладом.
Зареєстрований користувач

3
Точніше, ви не ухиляєтесь від крапки двічі, ви уникаєте символу втечі, щоб він перейшов у греп
Cthulhu

5
Ви можете використовувати лапки , щоб уникнути втечі зворотного слеша: man gcc | grep '\.'.
Леонід Бещасний

1
Я дуже віддаю перевагу пропозиції Леоніда Бещастного через те, наскільки зрозуміліше це відбувається
Ізката

Відповіді:


24

Як правило, вам потрібно лише один раз уникнути, щоб особливий персонаж вважався буквальним. Іноді вам доведеться це зробити двічі, тому що ваш шаблон використовується більш ніж однією програмою.

Дозвольте обговорити ваш приклад:

man gcc | grep \\.

Ця команда інтерпретується двома програмами, bashінтерпретатором та grep. Перша причина втечі bashзнає \буквально, тому другий - пропуск grep.

Якщо ви тікаєте тільки один раз, \., bashзнатиме це точка є буквальним, і перейти .до grep. Побачивши grepце ., він вважає, що точка має особливий характер, а не буквальний.

Якщо ви втечете двічі, bashперейдете \.до картини grep. Тепер grepзнайте, що це буквальна крапка.


: Отже, чи залежить символ втечі для крапки від кількості використовуваних труб?. Для прикладу cmd | cmd | cmd | cmd \\\\. Це правильно????
Сухі

6
@Thushi: Ні. Це не має нічого спільного з тим, що ви використовуєте (або кілька) символів труби, але застосовується навіть для grep \\. my_file. Командний рядок інтерпретується оболонкою, використовуючи перший, \ щоб уникнути другого, тому один \ передається буквально в греп. Крапка .не є спеціальною для оболонки, тому вона все одно передається дослівно. Потім Греп читає (сингл) \ і використовує його, щоб уникнути точки ..
Ansgar Esztermann

@AnsgarEsztermann: Так. Це правда. Перевірив. Дякую :)
Thathi

2
Я вважаю, що відповідь дещо невірна в тому, що в ній сказано: "Перша втеча викликає баш. Знається буквально, друга - за греп". Власне, перший втеча дає зрозуміти, що \ є бічний, і пропустити \. грепати.
Cthulhu

@Gnouc Я не думаю, що це так. echo .в баші просто ... перегукується бах .характер.
Cthulhu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.