Устранить несколько пробелов из файла и изменить исходный файл - PullRequest
0 голосов
/ 16 марта 2020

Укажите команду, которая удаляет несколько пробелов из текстового файла, оставляя один пробел на их месте. Дополнительные требования: Исходный файл, подлежащий изменению.
Удалось извлечь эти 3 команды:

awk '{$2=$2};1' filename.txt

tr -s '[:space:]' < filename.txt > filename.new && mv filename.new filename.txt  

sed -i 's/\s\+/ /g' filename.txt 

Не уверен, что использование «временного файла» - лучший способ добиться цели. Есть ли более эффективный способ решить проблему? Не имеет значения, если это tr / sed / awk или что-то еще, вы можете опубликовать все из них.

Пример ввода:

    I'm   just  giving   spaces 

Вывод:

 I'm just giving spaces

Редактировать: Все еще ищу больше ответов

1 Ответ

0 голосов
/ 16 марта 2020

Я бы использовал 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...