команда 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 

5 ответов


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


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

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

к downcase также:tr -s '[:space:]' < test.txt | tr '[:upper:]' '[:lower:]'


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

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

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

или

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

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

'\s+'

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

' '