Как удалить конечные пробелы для нескольких файлов?
Существуют ли какие-либо инструменты/одиночные вкладыши UNIX, которые удаляли бы скрывающиеся пробелы для нескольких файлов на месте.
например. который можно было бы использовать в сочетании с поиском.
Ответы
Ответ 1
Вы хотите
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,\}$//' {} \+
Ответ 2
В отличие от других решений, для которых все требуют 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 {} +
Изменить: эта слегка измененная версия сохраняет разрешения файлов:
find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
Ответ 3
Я использовал this, чтобы исправить пробелы:
while IFS= read -r -d '' -u 9
do
if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
then
sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$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.
- Только беспокоиться о "нормальном" пробеле - если у вас есть вертикальные вкладки или такие в ваших файлах, это, вероятно, преднамеренное (тестовый код или необработанные данные).
- Пропускает каталоги VCS.git и .svn.
- Изменяет только файлы, которые
file
считает текстовым файлом.
- Сообщает обо всех путях, которые были пропущены.
- Работает с любым именем файла.
Ответ 4
Для тех, кто не является sed gurus (включая меня), я создал небольшой script для использования регулярных выражений JavaScript для замены текста в файлах и замены на месте:
http://git.io/pofQnQ
Чтобы удалить конечный пробел, вы можете использовать его как таковое:
$ node sed.js "/^[\t ]*$/gm" "" file
Enjoy
Ответ 5
ex
Попробуйте использовать редактор Ex (часть Vim):
$ ex +'bufdo!%s/\s\+$//e' -cxa *.*
Примечание. Для рекурсии (bash4 и zsh) вы можете использовать новую опцию globbing (**/*.*
). Включить shopt -s globstar
.
perl
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
согласно Spring Стиль кода рамки.
sed
Для использования sed
, проверьте: Как удалить конечные пробелы с помощью sed?
См. также: Как удалить конечные пробелы всех файлов рекурсивно?
Ответ 6
Как насчет этого:
sed -e -i 's/[ \t]*$//'
Btw, это удобный сайт: http://sed.sourceforge.net/sed1line.txt
Ответ 7
По какой-то причине команды sed и perl не работали для меня.
Это произошло:
find ./ -type f | rename 's/ +$//g'
Чувствует себя как самый прямой, чтобы читать, а также