Коли я пишу
$ grep \$
то все, що я набираю на терміналі, узгоджується і друкується на терміналі. Як \$трактується?
Коли я пишу
$ grep \$
то все, що я набираю на терміналі, узгоджується і друкується на терміналі. Як \$трактується?
Відповіді:
Оболонка інтерпретує \$і передаючи її через до 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він ставився до нього як до звичайного персонажа.
ls \$та бачити, що ми отримуємо "ls: $: Немає такого файлу чи каталогу", щоб побачити, що \ $ не націлено на $, але \\ $ не націлене на \ $ тощо.
Оболонка спочатку розширює будь керуючі послідовності перед передачею аргументів на програму, тому він інтерпретує \$як послідовність втечі і передає один аргумент $до grep, який відповідає кінцю рядка. Оскільки кожен рядок має кінець, то будь-який рядок повинен відповідати :)
man grep; було вирішено , що $відповідає кінцю рядка, незалежно від того , чи ні лінії відокремлені один від одного \n, \rяк, або що - то зовсім інше. У загальному випадку регулярні вирази можуть використовуватися для узгодження будь-якого рядка, а не лише "рядка", а $також використовуються для узгодження кінця рядка.
Це трактується як метахарактер кінцевого рядка. Якщо ви хочете відповідати фактичному знаку долара, зробіть це
$ grep \\$
або
$ grep '\$'
Ви можете врятувати проблему втечі, якщо хочете шукати літерал $, використовуючи регулярний вираз для класу символів. Наприклад,
$ grep '[$]' file
echo \$а потімecho \\$