Bagaimana cara menghapus baris kosong dari file (termasuk tab dan spasi)?

23

Saya ingin menghapus semua baris kosong dari file. Bahkan jika garis tersebut mengandung spasi atau tab, itu juga harus dihapus.

Jamshed Ansari user3000272
sumber

Jawaban:

26

Hanya grepuntuk yang tidak kosong:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], rentang karakter di dalam ( [...]), disebut kelas karakter POSIX. Ada beberapa seperti [:alpha:], [:digit:]... yang [:blank:]cocok dengan spasi putih horizontal (di lokal POSIX, itu adalah ruang dan tab, tetapi di lokal lain mungkin ada lebih banyak, seperti semua karakter jarak horizontal Unicode di lokal UTF8) sementara [[:space:]]mencocokkan putih horizontal dan vertikal. karakter spasi (sama seperti [:blank:]plus hal-hal seperti tab vertikal, umpan form ...).

grep '[:blank:]'

Akan mengembalikan baris yang berisi salah satu karakter, :, b, l, a, natau k. Kelas karakter hanya dikenali di dalam [...], dan di ^dalam [...]meniadakan set. Jadi [^[:blank:]]berarti setiap karakter kecuali yang kosong.

Stéphane Chazelas
sumber
1
haruskah juga ada garis $akhir?
Michael Durrant
@MichaelDurrant Ini tidak berlabuh di kedua sisi
jordanm
1
@MichaelDurrant. [^[:blank:]]$hanya akan cocok dengan garis yang berakhir dengan non-kosong. Kami ingin garis yang berisi non-kosong di mana saja
Stéphane Chazelas
@StephaneChazelas Saya mencoba grep [: blank:] SOURCEFILE bahkan perintah ini berfungsi. Saya mengerti [] untuk kelas karakter, bisakah Anda memberi saya ide tentang cara kerjanya? snippet: blank: baru bagi saya.
Jamshed Ansari user3000272
Apakah ada kasus di mana grep -E '\S'tidak akan berfungsi?
terdon
21

Ini awksolusinya:

$ awk NF file

Dengan awk, NFhanya diatur pada garis yang tidak kosong. Ketika kondisi ini cocok, awktindakan default yaitu printakan mencetak seluruh baris.

cuonglm
sumber
Rapi, ini juga menghilangkan garis dengan spasi.
wisbucky
7

Bagaimana tentang:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

atau

sed -e '/^[[:blank:]]*$/d' source_file > newfile

yaitu

Untuk setiap baris, gantikan:

  • jika dimulai (" ^")
  • dengan spasi atau tab (" [[:blank:]]") nol atau lebih banyak kali (" *")
  • dan kemudian adalah akhir dari baris (" $")

Info lebih lanjut tentang :: blank :: dan karakter khusus lainnya di http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
sumber
4
[[:space:]]termasuk tab. Jika tidak, regex Anda akan gagal jika spasi mengikuti tab.
jordanm
The wctype(3)dan isalpha(3)manual menggambarkan apa yang akan cocok dengan kelas karakter.
jordanm
Anda mungkin ingin menghapus yang pertama yang tidak menjawab pertanyaan.
Stéphane Chazelas
@MichaelDurrant bisakah Anda menulis sesuatu tentang [[: blank:]]?
Jamshed Ansari user3000272
Menambahkan info untuk [[: kosong ::]]. Stephane, mengapa tidak bekerja pertama kali? Saya pikir // pada akhirnya akan mengganti saluran tanpa apa-apa.
Michael Durrant
4

Anda dapat menggunakan sedperintah untuk menghapus baris kosong:

sed '/^$/d' in > out

Perintah ini menghapus semua baris kosong dari file "in"

Raghavendra
sumber
Itu tidak menghapus baris yang hanya berisi ruang dan tab, seperti yang diminta secara khusus.
dave_thompson_085
3

Sepertinya saya sudah menemukan yang tidak secepat itu, tapi lucu akhirnya:

| xargs -L1

poige
sumber
1
Bagus pendek, tetapi tidak lebih: menghapus spasi dan tab terkemuka juga.
Jringoot
Oh, ternyata lebih mampu? - Bagus! ;-P
poige
1
Dan itu memotong garis (default pada 1024 karakter) Lihat halaman manual: linux.die.net/man/1/xargs
jringoot
Saya jatuh cinta lebih dalam dengan alat sederhana itu !!! 11)
poige
0

Coba ex -way:

ex -s +'v/\S/d' -cwq test.txt

Untuk banyak file (edit di tempat):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Catatan: :bufdoPerintah ini bukan POSIX .

Tanpa memodifikasi file (cukup cetak pada output standar):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
sumber
note bufdo bukanlah POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Gunakan perintah berikut:

grep '\S' FILE

yang menghapus semua baris termasuk spasi atau tab.

Jika tidak, penghapusan tidak termasuk garis dengan spasi / tab, gunakan:

grep . FILE

Sebagai contoh:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Lihat juga:

kenorb
sumber