linie grep zaczynające się od „1” w Ubuntu

47

Próbuję wyszukać wiersze zaczynające się od „1” za pomocą

ls -1 | grep ^1*

ale zwraca wiersze, które nie zaczynają się od 1. Czego tu brakuje?

Tim
źródło
Jeszcze jedna uwaga: jeśli chcesz użyć grep, aby ograniczyć lswyjście, napotkasz problemy, jeśli nazwy plików zawierają dziwne znaki, takie jak znaki nowej linii ... Wiele innych poleceń (w jakiś sposób nie ls, przynajmniej wersja, którą muszę sprawdzić) mają opcję rozdzielania wartości zerowej, którą następnie można bezpiecznie przetwarzać za pomocągrep -z
Gert van den Berg
Dzięki, @GertvandenBerg! Jakie problemy mogą powodować grep w przypadku niektórych dziwnych znaków, takich jak znaki nowej linii? Jakie polecenia dają rozdzielone wartości zerowe?
Tim
1
znajdź z -print0, większość innych narzędzi GNU ma opcję -0 lub -z. (sortuj, xargs itp.). Jeśli nazwy plików zawierają nowe linie, nie byłoby możliwe ustalenie, czy dwie linie to nazwa pliku zawierająca nową linię, czy dwie oddzielne nazwy plików.
Gert van den Berg

Odpowiedzi:

68

Twoje wyrażenie regularne nie znaczy, co myślisz. Dopasowuje wszystkie linie rozpoczynające się od (^) z jednym (1) powtórzeniem zero lub więcej (*) razy. Wszystkie ciągi pasują do tego wyrażenia regularnego. grep '^1'robi co chcesz.

otokan
źródło
33

Próbowałeś następujących rzeczy?

 ls -1 | grep "^1"

Oznacza to, że usuń *, co w zasadzie mówi grep, znajdź zero lub więcej wystąpień ^1wyrażenia. Innymi słowy: dopasuj linie rozpoczynające się od 1 lub nie.

Bernhard
źródło
13

Chociaż to nie odpowiada na twoje pytanie, jest to lepsze rozwiązanie tego, co wydaje się twoim celem:

ls -ld 1*

Możesz użyć globu powłoki, aby wyświetlić listę wszystkich plików, które zaczynają się od 1. Zauważ, że *ma inne znaczenie w globowaniu powłoki niż wyrażenia regularne.

Jordan
źródło
Dzięki! +1. W jaki sposób * ma inne znaczenie w globowaniu powłoki i wyrażeniach regularnych?
Tim
2
W powłoce glob * jest symbolem wieloznacznym oznaczającym „0 lub więcej dowolnych znaków”. Znaczenie wyrażenia regularnego wyjaśniono w odpowiedzi otokana.
jordanm
3

^ 1. * dopasowuje całą linię, lub tak jak powiedziano powyżej, ^ 1 ma łańcuch zawarty w linii.

różne style wyrażeń regularnych używają różnych symboli reprezentujących znaki, niektóre opcje określają, który styl chcesz. a różne opcje określają, czy chcesz dopasować cały wiersz, czy tylko jego część, czy cały wpis jako jeden ciąg.

Shellukolle
źródło