Jak „grep” dla długości linii w danym zakresie?


28

UWAGA: To pytanie jest uzupełnieniem tego pytania i odpowiedzi: Jak „grep” dla długości linii * nie * w danym zakresie?


Muszę uzyskać tylko wiersze z pliku tekstowego (lista słów oddzielona znakiem nowej linii), który ma zakres długości minimum lub równy 3 znakom, ale nie dłuższy lub równy 10.

Przykład:

WKŁAD:

egyezményét
megkíván
ki
alma
kevesen
meghatározó

WYDAJNOŚĆ:

megkíván
alma
kevesen

Pytanie: Jak mogę to zrobić bash?


9
grep -x '.\{3,10\}'
Costas

@Costas genialny, to samo dotyczy sed. Opublikuj pełną odpowiedź.
orion

Odpowiedzi:


37
grep -x '.\{3,10\}'

gdzie

  • -x dopasuj wzór do całej linii
  • . dowolny symbol
  • {3,10} obliczyć od 3 do 10 razy poprzedni symbol (w przypadku dowolnych)

10

przy użyciu egrep

egrep '^.{3,10}$'

dopasowuje od początku do końca linii dla 3 lub więcej znaków, ale mniej niż lub 10 znaków.


1

Używanie sed:

sed '/^.\{3,10\}$/!d'

Lub:

sed -r '/^.{3,10}$/!d'

0

Używanie awk:

awk 'length >= 3 && length <= 10' file

lengthOświadczenie wróci długość $0(aktualny rekord / linia) domyślnie, a ten jest używany przez kod do testu pogoda długość linia jest w podanym zakresie. Jeśli test taki jak ten nie ma odpowiedniego bloku akcji, domyślną akcją jest wydrukowanie rekordu.

Testowanie podanych danych:

$ awk 'length >= 3 && length <= 10' file
megkíván
alma
kevesen

Podobnie z Perlem:

$ perl -lne '$l=length($_); print if ($l >= 3 && $l <= 10)' file
megkíván
alma
kevesen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.