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.