Bagaimana cara menghapus garis yang lebih pendek dari XY?

29

Saya menemukan pertanyaan tentang, cara menghapus garis yang lebih panjang dari 2048 karakter:

Bagaimana cara menghapus baris jika lebih lama dari XY?

T: Tapi bagaimana saya bisa menghapus garis lebih pendek dari 4 karakter? Jadi hapus baris yang memiliki panjang 1 atau 2 atau 3 file.

PEMBARUAN: Terima kasih atas banyak jawaban BAIK, tetapi saya hanya dapat menandai satu sebagai OK

evachristine
sumber

Jawaban:

42

Anda bisa menggunakannya sed. Berikut ini akan menghapus garis yang panjangnya 3 karakter atau lebih kecil:

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

Untuk menyimpan perubahan ke file di tempat, berikan -iopsi.

Jika versi sedAnda tidak mendukung sintaks RE yang diperluas, maka Anda dapat menulis yang sama di BRE:

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

yang akan bekerja dengan semua sedvarian.


Anda juga bisa menggunakan awk:

awk 'length($0)>3' filename

Menggunakan perl:

perl -lne 'length()>3 && print' filename
devnull
sumber
sed '/^.\{,3\}$/d'tidak bekerja dengan BSD sed: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). Versi sed -r valid secara sintaksis, tetapi tidak akan menghapus baris.
Dereckson
5

Beberapa variasi lagi:

grep .... file

atau

sed '/..../!d' file

atau

sed -n 's/./&/4p' file

atau

awk 'gsub(/./,"&")>3' file

atau

awk 'length>3' file

atau GNU awk:

awk 'NF>3' FS= file
Pengamat
sumber
1
Oh, grep itu .... sangat elegan!
Grofte
3

Berikut adalah solusi Vim menggunakan mode Ex Vim dan globalperintahnya.

Ini sangat mirip dengan menggunakan sed, hanya saja beberapa karakter khusus ('{', '}') harus diloloskan.

:g/^.\{,3\}$/d

Menggunakan mode Regis Sangat Sihir Vim (\ v), pelolosan ini dapat dihindari.

:g/\v^.{,3}$/d

Lihat juga: bantuan sulap

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

Terkadang juga berguna untuk melakukan yang sebaliknya vglobal.

:v/\v^.{,3}$/d

akan menghapus semuanya kecuali baris hingga 3 karakter.

gergap
sumber
1

untuk langsung menghapus garis yang Anda bisa:

sed -ri '/.{4}/!d' /path/to/file

Atau BRE:

sed -i '/.\{4\}/!d' /path/to/file

Jika suatu baris tidak mengandung 4 karakter atau lebih, itu dihapus.

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

Melakukan hal di atas dalam subshell perintah-substitusi akan memastikan bahwa grepmendapat deskriptor baca di atasnya sebelum kucing mulai menulis untuk itu, tetapi <<HEREDOCjuga akan memastikan bahwa hasilnya tetap dialirkan dan tidak menyebabkan kesalahan panjang argumen.

mikeserv
sumber
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
Hauke ​​Laging
sumber
0

Anda bisa menggunakan grep:

Jika Anda menghitung spasi terdepan dalam panjang garis:

grep -e '[^\ ]\{4,\}' file

Jika Anda tidak menghitung spasi di baris pertama:

grep -e '[^\]\{4,\}' file
cuonglm
sumber