Как удалить конечные пробелы для нескольких файлов?
есть ли какие-либо инструменты / UNIX одиночные лайнеры, которые удаляли бы конечные пробелы для нескольких файлов на месте.
например, тот, который может быть использован в сочетании с найти.
7 ответов:
вы хотите
sed --in-place 's/[[:space:]]\+$//' file
это будет удалить все стандартные символы пробела POSIX, включая вертикальную вкладку и канал формы. Кроме того, он будет выполнять замену только в том случае, если конечные пробелы действительно существуют, в отличие от других ответов, которые используют нулевой или более сопоставитель (
*
).
--in-place
- это просто длинная форма-i
. Я предпочитаю использовать длинную форму в скриптах, потому что она, как правило, более иллюстрирует то, что флаг на самом деле делает.его можно легко интегрировать с
find
вот так:find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+
если вы находитесь на Mac
как указано в комментариях, вышеизложенное не работает, если у вас не установлены инструменты gnu. Если это так, вы можете использовать следующее:
find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
В отличие от других решений, которые все требуют GNU sed, этот должен работать на любой системе Unix, реализующей стандартные команды POSIX.
find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && mv /tmp/.$$ "$i";done' arg0 {} +
изменить: эта слегка измененная версия сохраняет файлы permissions:
find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
Я использую этой исправить пробел:
while IFS= read -r -d '' -u 9 do if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]] then sed -i -e 's/[ \t]\+\(\r\?\)$//;$a\' -- "$REPLY" else echo "Skipping $REPLY" >&2 fi done 9< <(find . \( -type d -regex '^.*/\.\(git\|svn\|hg\)$' -prune -false \) -o -type f -print0)
характеристики:
- сохраняет возврат каретки (в отличие от
[:space:]
), поэтому он отлично работает с файлами в стиле Windows/DOS.- беспокоит только "нормальный" пробел - если у вас есть вертикальные вкладки или такие в ваших файлах, это, вероятно, намеренно (тестовый код или необработанные данные).
- пропускает .git'а .ВКС каталоги в SVN.
- изменяет только файлы
file
думает, что это текстовый файл.- сообщает Все пути, которые были пропущены.
- работает с любой имя файла.
для тех, кто не является гуру sed (включая меня) я создал небольшой скрипт для использования регулярных выражений JavaScript для замены текста в файлах и делает замену на месте:
чтобы удалить конечные пробелы, вы можете использовать его как таковой:
$ node sed.js "/^[\t ]*$/gm" "" file
наслаждайтесь
Как насчет этого:
sed -e -i 's/[ \t]*$//'
кстати, это удобный сайт: http://sed.sourceforge.net/sed1line.txt
ex
попробуйте использовать бывший редактор (часть Vim):
$ ex +'bufdo!%s/\s\+$//e' -cxa *.*
Примечание: Для рекурсии (bash4 & zsh), вы можете использовать новый подстановка параметра (
**/*.*
). Включить с помощьюshopt -s globstar
.
perl
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
по состоянию на Spring Framework Code Style.
sed
использовать
sed
, Регистрация: как удалить конечные пробелы с помощью СЭД?
Читайте также: как удалить конечные пробелы всех файлов рекурсивно?