GNU/Linux >> Belajar Linux >  >> Linux

sed ganti semua tab dan spasi dengan satu spasi

Solusi 1:

Gunakan sed -e "s/[[:space:]]\+/ /g"

Berikut penjelasannya:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

Untuk penggantian Anda, Anda hanya ingin memasukkan spasi. [:space:] tidak akan berfungsi di sana karena itu adalah singkatan dari kelas karakter dan mesin regex tidak akan tahu karakter apa yang harus diletakkan di sana.

+ harus di-escape di regex karena dengan mesin regex sed + adalah karakter normal sedangkan \+ adalah karakter meta untuk 'satu atau lebih'. Di halaman 86 dari Menguasai Ekspresi Reguler , Jeffrey Friedl menyebutkan dalam catatan kaki bahwa ed dan grep menggunakan tanda kurung yang lolos karena "Ken Thompson merasa ekspresi reguler akan digunakan untuk bekerja terutama dengan Ccode, di mana kebutuhan untuk mencocokkan tanda kurung mentah akan lebih umum daripada referensi balik." Saya berasumsi bahwa dia merasakan hal yang sama tentang tanda tambah, oleh karena itu kebutuhan untuk menghindarinya untuk menggunakannya sebagai karakter meta. Sangat mudah tersandung oleh ini.

Di sed Anda harus keluar dari + , ? , | , ( , dan ) . atau gunakan -r untuk menggunakan regex yang diperluas (maka sepertinya sed -r -e "s/[[:space:]]\+/ /g" atau sed -re "s/[[:space:]]\+/ /g"

Solusi 2:

Anda dapat menggunakan -s opsi ("memeras") dari tr :

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:] kelas karakter terdiri dari spasi dan tab.


Linux
  1. Bagaimana Mengganti String Dengan String Yang Mengandung Slash Dengan Sed?

  2. Menghapus Semua Komentar C Dengan Sed?

  3. Ganti Baris Dengan Konten Lain Menggunakan Sed Dan Paralel Untuk File Besar?

  1. Ganti Rentang Garis Dengan Rentang Garis (sed Atau Lainnya)?

  2. Ganti Semua Baris Baru Ke Spasi Kecuali Yang Terakhir?

  3. Menggunakan grep dan sed untuk mencari dan mengganti string

  1. Temukan dan ganti dengan sed di direktori dan sub direktori

  2. Bagaimana cara mengganti tanda kutip tunggal dengan karakter lain di sed?

  3. sed menyisipkan baris dengan spasi ke baris tertentu