Використовуйте sed -e "s/[[:space:]]\+/ /g"
Ось пояснення:
[ # 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).
Для заміни потрібно лише вставити пробіл. [:space:]
не буде працювати там, оскільки це абревіатура для класу символів, а движок регулярних виразів не знає, який символ туди поставити.
+
Повинні бути екрановані в регулярному виразі , тому що з СЄПН регулярних виразів +
є нормальним характер , тоді як \+
це метасимволом для «один або більше». На сторінці 86 « Освоєння регулярних виразів» Джефрі Фрідл в примітці зазначає, що редактор і греп використовували втечені дужки, оскільки «Кен Томпсон вважав, що регулярні вирази будуть використовуватися для роботи в основному з кодом С, де необхідність узгодження сирих дужок буде більш поширеною, ніж зворотна посилання. . " Я припускаю, що він ставився так само і до знаку плюс, звідси необхідність уникати його, щоб використовувати його як метахарактер. Це легко спокуситись.
У СЕД вам потрібно бігти +
, ?
, |
, (
, і )
. або використовувати -r, щоб використовувати розширений регулярний вираз (тоді це виглядає як sed -r -e "s/[[:space:]]\+/ /g"
абоsed -re "s/[[:space:]]\+/ /g"