Come "grep" per la lunghezza della linea * non * in un determinato intervallo?


17

NOTA: questa domanda è il complemento di queste domande e risposte: come "grep" per la lunghezza della linea in un determinato intervallo?


Come possiamo chiamare per le righe che hanno meno di 8 o più di 63 caratteri, nessuna che contenga più di otto e meno di 63 caratteri?

Quindi, alcuni conteggi dei personaggi accettabili potrebbero essere ...

7 6 5 4 3 2 1 0

...e...

64 65 66 67 ...

3
So che lo chiedi grep, ma potresti prendere in considerazione awk, soprattutto se hai bisogno di ulteriori elaborazioni, ecc. (Molto flessibile e leggibile ): awk '( length($0)<8 ) || ( length($0)>63 )' #default action di una condizione è stampare le righe che corrispondono alla condizione. Oppure, con meno elaborazioni su $ 0:awk '{ l=length($0) ; if (( l<8 ) || l>63 ) { print $0 ;} }'
Olivier Dulac il

@mikeserv - sì, guardandolo di nuovo, probabilmente ha più senso chiudere questo Q&A all'altro come il dup.
slm

@mikeserv - in genere è una seccatura, devo unire le risposte in una delle Q e poi vengono cancellate dall'originale. Questa è la guida per farlo: "Le domande dovrebbero essere unite quando sono identiche al 99% e sarebbe utile avere tutte le risposte da più domande duplicate in un unico posto. Ciò elimina le risposte, le sposta alla domanda target e lascia la domanda corrente come uno stub con un collegamento al suo obiettivo di unione. "
slm

cosa è successo al mio commento?
Dmitry Grigoryev il

@DmitryGrigoryev - immagino che a qualcuno non sia piaciuto. prendilo da uno che è stato lì - dimenticalo.
Mikeserv,

Risposte:


38
grep -xv '.\{8,63\}' <input >output

grepL ' -xinterruttore indica una corrispondenza di un'intera linea , vale a dire che qualsiasi modello abbinato deve definire una linea dalla testa alla coda. facendo ...

grep -x pattern

... equivale generalmente a ...

grep ^pattern$

grepL ' -vinterruttore annulla l' influenza di un modello sulla selezione della linea. generalmente facendo ...

grep pattern

... selezionerà solo le linee che corrispondono al modello, ma con un -vmodello negato vengono selezionate solo quelle linee che non corrispondono.

...e così...

grep -xv '.\{8,63\}'

... corrisponde a tutte le linee che consistono dalla testa alla coda di un numero compreso tra 8 e 63 caratteri e la -vselezione negata causa grepsolo la stampa di tutto il resto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.