Дивна поведінка «ls -a | grep ^ \. "


10

Я хотів перерахувати вміст pwd та відобразити лише файл, починаючи з крапки. Я спробував, ls -a | grep ^\.але не можу зрозуміти, чому вихід містить також файли, які не починаються з крапки. Наприклад:

Pictures
.pip
.pki
.profile
projects
Public

Я знаю, що я можу досягти того, чого хочу, ls -ld .*мені просто цікаво про цю поведінку грепу, яку я не можу пояснити.



Чому б не просто ls -d .*перерахувати всі файли, починаючи з .?
Бармар

Застереження: Ніколи не передайте висновок ls в іншу команду. Використовуйте натомість. У мене є занадто багато ідеосинкразій, яким можна довіряти. Дивіться: Pitfall 1 на mywiki.wooledge.org/BashPitfalls - це # 1! Решта сайту також чудова.
Джо

Відповіді:


20

Цитуйте аргумент grep, таким чиномls -a | grep '^\.'

Причиною цього є те, що оболонка обробляє \.та перетворює її назад у звичайну ., що grepпотім трактується як знак символів з одним символом. Якщо ви сумніваєтесь, завжди цитуйте рядок, який містить (або може містити) символ, який є спеціальним для оболонки.


Чому оболонка ігнорує \?
ps-aux

\ - послідовність евакуації, яка змушує оболонку трактувати наступний символ як буквальний. У цьому grep ^\\.\\ трактується оболонкою як один зворотний косий ривок, і знову ж таки греп трактує один зворотний косий рисок, а потім крапку як буквальну крапку.
Avinash Raj

11

Потрібно поставити греп-регекс всередині лапок.

ls -a | grep '^\.'

Примітка: Не розбирайте вихід lsкоманди .


Чому погано розбирати вихід ls?
ps-aux

За посиланням: Якщо в стандартному режимі стандартний вихід не є терміналом, ls відокремлює назви файлів новими рядками. Це добре, поки у вас не буде файлу з новим рядком у його імені.
Майкл Дюррант

@Michael Durrant: Я б припустив, що дозволення нових рядків у файлах файлів є головною помилкою в системі.
jamesqf

@jamesqf - перегляньте нові рядки у назви файлів (особливо відповідь sml ).
don_crissti

0

Якщо виконати cmd ls -a | греп ^ \. тоді grep не розглядають "\" як особливий символ та значення ". не тікайте.

Коли ми використовуємо cmd ls -a | grep "^ \." тоді grep розглядає "\" як особливий символ та значення ". втікає. Це дасть результат, як очікувалося.

Якщо ви хочете використовувати grep cmd без лапок, вам також слід уникнути символу "\". Ви можете очікувати результату без подвійних лапок, дотримуючись команди. лс -а | grep ^ \\.

Детальніше про значення спеціальних символів у Regex див. За посиланням. http://www.regular-expressions.info/quickstart.html

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