Я бы использовал ed
вместо нестандартного sed -i
(и непереносимого RE в вашем примере), если вы хотите изменить исходный файл:
printf "%s\n" '1,$s/[[:space:]]\{2,\}/ /g' w | ed -s filename.txt
или с perl
:
perl -pi -e 's/\s{2,}/ /g' filename.txt
Конструкция регулярного выражения {2,}
(\{2,\}
для POSIX Basi c Регулярные выражения, такие как sed
и ed
use) соответствует 2 или более предыдущим токенам.
Оба они соответствуют любым пробельным символам, а не только пробелу, потому что так работают ваши примеры. Если целью является сжатие только нескольких пробелов, а не пробелов + табуляции, отключите [[:space:]]
и \s
только для одного пробела.
(Все, что изменяет файл "на месте", будь оно ed
, sed -i
, perl -i
или обычный редактор имеют хорошие шансы, что, между прочим, он собирается использовать временный файл под колпаком. Они просто обрабатывают его для вас, так что у вас нет сделать это вручную, как на примере tr
.