Як інтерпретується \ $ грепом?


Відповіді:


18

Оболонка інтерпретує \$і передаючи її через до Grep , як $, в кінці рядка. Тож якщо припустити, що ваша лінія закінчується, вона буде відповідати :-)

Якщо ви хочете відповідати фактичному $в grep, скористайтеся одним із:

grep \\\$
grep '\$'

У першому оболонка інтерпретується \\як \і \$як $, даючи \$. В останньому це зовсім не тлумачить.


Що стосується вашого питання, чому \$відповідає знак долара, а не двозначна послідовність, регулярні вирази, як ті, що використовуються для grepвикористання спеціальних символів для певних цілей. Деякі з них:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

разом з багатьма іншими.

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


1
перевірити те, що бачить греп, спробуйте, echo \$а потімecho \\$

У grep \\\ $, як ви сказали, \ $ передається в grep, тому він повинен відповідати рядкам, що містять \ $, але чому він відповідає тій строці, яка містить лише $?

Тому що $ в грепі означає кінець рядка. Щоб відповідати символу $, вам потрібно уникнути цього, щоб гріп не ставився до нього спеціально. Дивіться моє оновлення.

@Pasi: echo робить власне нерозмітнення, залежно від того, вбудована вона в оболонку чи ні, сумісна з POSIX чи ні. Іще краще (IMHO) використовувати ls \$та бачити, що ми отримуємо "ls: $: Немає такого файлу чи каталогу", щоб побачити, що \ $ не націлено на $, але \\ $ не націлене на \ $ тощо.
Генно

5

Оболонка спочатку розширює будь керуючі послідовності перед передачею аргументів на програму, тому він інтерпретує \$як послідовність втечі і передає один аргумент $до grep, який відповідає кінцю рядка. Оскільки кожен рядок має кінець, то будь-який рядок повинен відповідати :)


Але наскільки $ закінчується рядок? Чи не кінець рядка \ n?

2
@Happy Mithal: Дивіться man grep; було вирішено , що $відповідає кінцю рядка, незалежно від того , чи ні лінії відокремлені один від одного \n, \rяк, або що - то зовсім інше. У загальному випадку регулярні вирази можуть використовуватися для узгодження будь-якого рядка, а не лише "рядка", а $також використовуються для узгодження кінця рядка.

2

Це трактується як метахарактер кінцевого рядка. Якщо ви хочете відповідати фактичному знаку долара, зробіть це

 $ grep \\$ 

або

 $ grep '\$' 

1

^призначений для початку рядка і $для кінця.

grep \$

або

grep $

відповідатиме кожній рядку, тому все, що ви введете, повторюється назад

Спробуйте

grep a$

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


1

Ви можете врятувати проблему втечі, якщо хочете шукати літерал $, використовуючи регулярний вираз для класу символів. Наприклад,

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