Sed для замены нескольких пространств на отдельные пробелы

Я попытался заменить несколько пробелов в файле на одно пространство с помощью sed.

Но он разбивает каждый символ, как показано ниже. Пожалуйста, дайте мне знать, в чем проблема...

$ cat test.txt
 iiHi Hello   Hi
this   is   loga

$

$ cat test.txt | tr [A-Z] [a-z]|sed -e "s/ */ /g"
 i i h i h e l l o h i
 t h i s i s l o g a 

Ответ 1

Ваша команда sed делает неправильную вещь, потому что она соответствует "ноль или больше пробелов", что, конечно, происходит между каждой парой символов! Вместо s/ */ /g вы хотите s/ */ /g или s/ +/ /g.

Ответ 2

Используя tr, параметр -s будет сжимать последовательные символы для одного:

tr -s '[:space:]' < test.txt
 iiHi Hello Hi
this is loga

В нижнем регистре: tr -s '[:space:]' < test.txt | tr '[:upper:]' '[:lower:]'

Ответ 3

Вы можете использовать awk, чтобы решить эту проблему:

awk '{$0=tolower($0);$1=$1}1' test.txt
iihi hello hi
this is loga

Ответ 4

sed 's/ \+/ /g' test.txt | tr [A-Z] [a-z]

или

sed 's/\s\+/ /g' test.txt | tr [A-Z] [a-z]

Ответ 5

Возможно, вы можете сопоставить следующее регулярное выражение для нескольких пространств:

'\s+'

и замените одним пробелом следующим образом:

' '