У меня есть простой сценарий оболочки, который удаляет конечные пробелы из файла. Есть ли способ сделать этот скрипт более компактным (без создания временного файла)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Виктор
источник
источник
mv
вместоcat
иrm
. Почему выcat
вообще так используете? Почему бы не использоватьcp
?cat
для перезаписи исходного файла вместоmv
фактической замены данных в исходном файле (т. Е. Не приведет к разрыву жестких ссылок). Использование того,sed -i
что предлагается во многих решениях, не поможет. Айо, просто продолжай делать то, что делаешь.Ответы:
Вы можете использовать в месте опции
-i
изsed
для Linux и Unix:Имейте в виду, что выражение удалит завершающие
t
символы в OSX (вы можете использовать,gsed
чтобы избежать этой проблемы). Он также может удалить их на BSD.Если у вас нет gsed, вот правильный (но трудный для чтения) синтаксис sed для OSX:
Три строки в одинарных кавычках в конечном итоге объединяются в один аргумент / выражение. В bash нет оператора конкатенации, вы просто помещаете строки одну за другой без пробелов между ними.
В
$'\t'
решает , как буквальная вкладку-символ в Баше ( с использованием ANSI-C со ссылкой ), так что язычок правильно сцеплен в выражение.источник
sed: Not a recognized flag: i
t
:)\t
- вкладка для тех, кто еще не знает.По крайней мере, в Mountain Lion ответ Виктора также удалит символ «t», когда он находится в конце строки. Следующие исправления этой проблемы:
источник
-E
указать «расширенные (современные) регулярные выражения»sed
на Эль-Капитане - нет.Спасибо codaddict за предложенный
-i
вариант.Следующая команда решает проблему на Snow Leopard.
источник
\t
sed, кроме GNU sed, и он интерпретируется как буквальная букваt
. Команда только кажется работающей, вероятно, потому, что в завершающем пробеле нет табуляции илиt
в конце предложения в вашем файле. Использование''
без указания суффикса резервной копии не рекомендуется.Лучше всего также указать 1 доллар:
источник
источник
У меня есть сценарий в моем .bashrc, который работает под OSX и Linux (только bash!)
к которому я добавляю:
источник
Для тех, кто ищет эффективность (много файлов для обработки или огромные файлы), использование
+
оператора повторения вместо*
ускорения выполнения команды более чем в два раза.С GNU sed:
Я также быстро протестировал кое-что еще: использование
[ \t]
вместо[[:space:]]
также значительно ускоряет процесс (GNU sed v4.4):источник
Просто для развлечения:
источник
В конкретном случае
sed
, то-i
вариант , что другие уже упоминалось далеко и далеко самый простой и здравомыслящий один.В более общем случае,
sponge
изmoreutils
коллекции делает именно то, что вы хотите: он позволяет вам заменить файл результатом его обработки способом, специально разработанным для того, чтобы этап обработки не споткнулся о себе, перезаписывая тот самый файл, в котором он находится. работа над. Чтобы процитироватьsponge
страницу руководства :https://joeyh.name/code/moreutils/
источник
Чтобы удалить только пробелы (в моем случае пробелы и табуляции) из строк, содержащих хотя бы один непробельный символ (таким образом, пустые строки с отступом не затрагиваются):
источник