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


есть ли какие-либо инструменты / UNIX одиночные лайнеры, которые удаляли бы конечные пробелы для нескольких файлов на месте.

например, тот, который может быть использован в сочетании с найти.

7 51

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 для замены текста в файлах и делает замену на месте:

http://git.io/pofQnQ

чтобы удалить конечные пробелы, вы можете использовать его как таковой:

$ 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, Регистрация: как удалить конечные пробелы с помощью СЭД?


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

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

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

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