греп-лінії, що починаються з "1" в Ubuntu


47

Я намагаюся шукати рядки, які починаються з "1", використовуючи

ls -1 | grep ^1*

але він повертає рядки, які не починаються з 1. Що я тут пропускаю?


Ще одна примітка: якщо ви хочете використовувати grep для обмеження lsвиводу, ви зіткнетесь з проблемами, якщо файли містять якісь дивні символи, такі як нові рядки ... Багато інших команд (якось ні ls, принаймні не версія, яку я повинен перевірити) є можливість дати нульовий розділений вихід, який ви можете потім безпечно обробитиgrep -z
Герт ван ден Берг

Дякую, @GertvandenBerg! Які проблеми можуть спричинити гребіння деяких дивних персонажів, таких як новинки? Які команди дають нульовий розділений вихід?
Тім

1
знайти з -print0, більшість інших інструментів GNU мають опцію -0 або -z. (сортування, xargs тощо). Якщо імена містять нові рядки, неможливо буде знати, чи два рядки - це ім'я файлу, що містить новий рядок або дві окремі назви файлів.
Герт ван ден Берг

Відповіді:


68

Ваш регулярний вираз не означає те, що ви думаєте, що це робить. Він збігається з усіма рядками, що починаються (^), з одним (1) повтореним нулем або більше (*) разів. Усі рядки відповідають цьому регулярному виразу. grep '^1'робить те, що ти хочеш.


33

Ви спробували таке?

 ls -1 | grep "^1"

Тобто, видаліть *, що в основному підказує grep, знайдіть нуль або більше випадків ^1виразу. Іншими словами: співставте рядки, які починаються з 1, чи ні.


13

Хоча це не відповідає на ваше запитання, це краще рішення того, що представляється вашою метою:

ls -ld 1*

Ви можете використовувати глобул оболонки, щоб перелічити всі файли, з яких починається 1. Зауважте, що *в глобулі оболонки є інше значення, ніж регулярні вирази.


Дякую! +1. Яким чином * має різний зміст у глобальній оболонці та у регулярних виразах?
Тім

2
У глобусі оболонки * є підстановка, що означає "0 або більше будь-якого символу". Значення регулярного вираження пояснюється у відповіді otokan.
Йорданм

3

^ 1. * відповідає цілому рядку, або так само, як сказано вище, ^ 1 отримав рядок, що міститься у рядку.

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

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