Коли я пишу
$ 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 \\$