Bagaimana cara "grep" untuk panjang garis * tidak * dalam rentang yang diberikan?

17

CATATAN: Pertanyaan ini merupakan pelengkap dari T&J ini: Bagaimana cara "grep" untuk panjang garis dalam rentang tertentu?


Bagaimana kita bisa menerima baris yang memiliki kurang dari 8 atau lebih dari 63 karakter, tidak ada yang mengandung lebih dari delapan dan kurang dari 63 karakter?

Jadi, beberapa jumlah karakter yang dapat diterima bisa ...

7 6 5 4 3 2 1 0

...dan...

64 65 66 67 ...
LoukiosValentine79
sumber
3
Saya tahu Anda memintanya grep, tetapi Anda dapat mempertimbangkan awk, terutama jika Anda membutuhkan pemrosesan lebih lanjut, dll (sangat fleksibel, dan dapat dibaca ): awk '( length($0)<8 ) || ( length($0)>63 )' Tindakan #default dari suatu kondisi adalah mencetak baris yang cocok dengan kondisi tersebut. Atau, dengan pemrosesan lebih sedikit pada $ 0:awk '{ l=length($0) ; if (( l<8 ) || l>63 ) { print $0 ;} }'
Olivier Dulac
@ mikeserv - yeah dalam melihat ini lagi, mungkin lebih masuk akal untuk menutup T&J ini sebagai dup.
slm
@ mikeserv - ini umumnya menyebalkan, saya harus menggabungkan jawaban menjadi salah satu dari Q dan kemudian dihapus dari aslinya. Ini adalah panduan untuk melakukannya: "Pertanyaan harus digabungkan ketika 99% identik dan akan bermanfaat jika memiliki semua jawaban dari beberapa pertanyaan duplikat di satu tempat. Ini menghapus jawaban, memindahkannya ke pertanyaan target, dan meninggalkannya pertanyaan saat ini sebagai sebuah rintisan dengan tautan ke target penggabungannya. "
slm
apa yang terjadi pada komentar saya?
Dmitry Grigoryev
@DmitryGrigoryev - kira seseorang tidak menyukainya. ambil dari yang sudah ada - lupakan saja.
mikeserv

Jawaban:

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

grep's -xsaklar menandakan seluruh baris pertandingan - yang mengatakan bahwa setiap pola yang cocok harus menentukan garis dari kepala ke ekor. perbuatan...

grep -x pattern

... umumnya setara dengan ...

grep ^pattern$

grep's -vberalih meniadakan pengaruh pola pada line-seleksi. umumnya melakukan ...

grep pattern

... hanya akan memilih garis yang cocok dengan pola, tetapi dengan -vpola yang dinegasikan hanya garis yang tidak cocok yang dipilih.

...dan sebagainya...

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

... cocok dengan semua baris yang terdiri dari head to tail di mana saja antara 8 dan 63 karakter, dan pemilihan yang -vdinegasikan grephanya menyebabkan untuk mencetak yang lainnya.

mikeserv
sumber