Menggunakan 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 pengganti Anda, Anda hanya ingin memasukkan spasi. [:space:]
tidak akan bekerja di sana karena itu adalah singkatan untuk kelas karakter dan mesin regex tidak akan tahu karakter apa yang harus diletakkan di sana.
Itu +
harus melarikan diri dalam regex karena dengan mesin regex sed +
adalah karakter normal sedangkan \+
merupakan metacharacter untuk 'satu atau lebih'. Di halaman 86 dari Mastering Regular Expressions , 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 kode C, di mana perlu mencocokkan tanda kurung mentah akan lebih umum daripada referensi ulang. . " Saya berasumsi bahwa dia merasakan hal yang sama tentang tanda plus, maka kebutuhan untuk menghindarinya untuk menggunakannya sebagai metacharacter. Sangat mudah untuk tersandung oleh ini.
Dalam sed Anda harus melarikan diri +
, ?
, |
, (
, dan )
. atau gunakan -r untuk menggunakan regex yang diperluas (kemudian terlihat seperti sed -r -e "s/[[:space:]]\+/ /g"
ataused -re "s/[[:space:]]\+/ /g"