Как удалить конечные пробелы для нескольких файлов?

Существуют ли какие-либо инструменты/одиночные вкладыши 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?


См. также: Как удалить конечные пробелы всех файлов рекурсивно?

Ответ 7

По какой-то причине команды sed и perl не работали для меня. Это произошло:

find ./ -type f | rename 's/ +$//g'

Чувствует себя как самый прямой, чтобы читать, а также