Коли використовувати одноціткові, подвійні цитати у греппі?


20

Під час спроби пошуку простого шаблону "привіт" у файлі працюють усі наступні форми грепу:

  • grep привіт файл1
  • grep 'привіт' файл1
  • grep "привіт" файл1

Чи є конкретний випадок, коли одна з вищезазначених форм працює, а інші - ні. Чи має значення, якщо я використовую один замість іншого?

Відповіді:


25

Це насправді залежить від вашої оболонки. Котирування (будь-якого виду) в першу чергу призначені для роботи з пробілом. Наприклад, такі:

grep hello world file1

шукатиме слово "привіт" у файлах під назвою "world" та "file1", а

grep "hello world" file1

шукатиме "привіт світ" у file1.

Вибір між одинарними або подвійними лапками важливий лише у тому випадку, якщо рядок пошуку містить змінні чи інші елементи, які, як ви очікуєте, будуть оцінені. За допомогою одиничних лапок рядок приймається буквально, і розширення не відбувається. За допомогою подвійних лапок змінні розширюються. Наприклад (із оболонкою, отриманою від Bourne, такою як Bash або ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

Перший grepшукатиме буквальний рядок "$ VAR1" у file1. Другий розширить змінну "$ VAR" і шукатиме рядок "serverfault" у file1.


Ключове, що слід зауважити, - це те, що в оригінальному запитанні grep насправді отримує ті самі самі аргументи кожного разу.
MikeyB

2
Будьте там обережні. $є кінцевим рядком у регулярному виразі, тому $VAR1насправді ніколи ні з чим не має відповідати. Це трапляється на GNU grep, але я все одно не розраховував би на таку поведінку. Вам потрібно \$VAR1буде безпечно відповідати буквальному рядку. (І вам знадобляться додаткові нахили, якщо це в подвійних котируваннях.)
Стівен Притчард

7

Джеймс правильний, але, щоб додати ще кілька даних, я вважаю, що найкращий спосіб подумати над цим як аргументи до команди: чи ви маєте намір "привіт" та "світ" - це два аргументи чи "привіт світ", щоб бути одним аргумент.

Також подвійні лапки дозволяють інтерпретувати більше, ніж просто змінні. Саме це залежить від вашої оболонки, але перевірте розширення історії, розширення дужок та розширення імені файлів.

Також важливо зазначити, що є деякі випадки, коли вам потрібно використовувати обидва типи цитат в одному аргументі. Пам’ятайте, що (за замовчуванням) аргументи розмежовані пробілом, тому якщо ви не залишаєте місця, ви все одно вказуєте той самий аргумент.

Механізм одиночного котирування оболонок більшості оболонок не передбачає жодних спеціальних символів, а це означає, що будь-який примірник іншої цитати, навіть якщо вона, здається, уникнула, закінчує цитату. Тому неможливо пропустити рядок з одним цитатам всередині одноцитованого рядка, і вам доведеться використовувати подвійні лапки. Це може бути болем, коли ви хочете передати аргумент, що містить одиничні цитати та щось, що було б інтерпретовано, але ви цього не хочете. Наприклад, якщо ви хотіли передати буквальний рядок "` `$ VAR 'є змінною", вам потрібно зробити це так:

"'"'$VAR'"' is a variable"

Це насправді об'єднання трьох рядків, що уникнули цитат:

"'"
'$VAR'
"' is a variable"

або, з вилученими цитатами:

'
$VAR
' is a variable

Насправді, з більшості снарядів, ви також можете це зробити так:

"'\$VAR' is a variable"

де зворотна косою рисою (" \") вказує оболонці буквально приймати наступний символ і не робити його розширення.

Але є деякі випадки, коли в кінцевому підсумку потрібно робити це способом багаторядкового конкатенації, не те, що я насправді зараз можу привести приклад.

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