использование 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 « Освоение регулярных выражений» Джеффри Фридл упоминает в сноске, что ed и grep использовали экранированные скобки, потому что «Кен Томпсон считал, что регулярные выражения будут использоваться в основном для работы с кодом C, где необходимость сопоставлять необработанные скобки будет более распространенной, чем обратная ссылка «. Я предполагаю, что он чувствовал то же самое по отношению к знаку плюс, отсюда и необходимость избегать его, чтобы использовать его в качестве метасимвола. Легко быть запутанным этим.
В СЭД вам нужно бежать +
, ?
, |
, (
, и )
. или используйте -r для использования расширенного регулярного выражения (тогда это выглядит как sed -r -e "s/[[:space:]]\+/ /g"
илиsed -re "s/[[:space:]]\+/ /g"