Ответ 1
Ваша команда sed
делает неправильную вещь, потому что она соответствует "ноль или больше пробелов", что, конечно, происходит между каждой парой символов! Вместо s/ */ /g
вы хотите s/ */ /g
или s/ +/ /g
.
Я попытался заменить несколько пробелов в файле на одно пространство с помощью 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
Ваша команда sed
делает неправильную вещь, потому что она соответствует "ноль или больше пробелов", что, конечно, происходит между каждой парой символов! Вместо s/ */ /g
вы хотите s/ */ /g
или s/ +/ /g
.
Используя tr
, параметр -s
будет сжимать последовательные символы для одного:
tr -s '[:space:]' < test.txt
iiHi Hello Hi
this is loga
В нижнем регистре: tr -s '[:space:]' < test.txt | tr '[:upper:]' '[:lower:]'
Вы можете использовать awk
, чтобы решить эту проблему:
awk '{$0=tolower($0);$1=$1}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+'
и замените одним пробелом следующим образом:
' '