Как удалить все завершающие пробелы всего проекта? Начиная с корневого каталога и удаляя конечные пробелы из всех файлов во всех папках.
Кроме того, я хочу иметь возможность напрямую изменять файл, а не просто выводить все на стандартный вывод.
bash
whitespace
iamjwc
источник
источник
Ответы:
Вот решение OS X> = 10.6 Snow Leopard.
Он игнорирует папки .git и .svn и их содержимое. Также он не оставит файл резервной копии.
источник
\+
вместо*
строки замены - в противном случае она будет соответствовать каждой отдельной строке.sed: RE error: illegal byte sequence
ко мне.export LANG=C
и попробуйте еще разexport LC_CTYPE=C
найти здесь: stackoverflow.com/questions/19242275/…Использование:
если вы не хотите, чтобы файлы ".bak" создавались:
как пользователь zsh вы можете опустить вызов find и вместо этого использовать:
Примечание: Для того, чтобы предотвратить уничтожение
.git
каталога, попробуйте добавить:-not -iwholename '*.git*'
.источник
.git
каталогами, независимо от того, насколько глубоко они вложены.find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
rsync -rv --exclude=.git repo/ repo2/
после чего локальные измененияrepo
также были в (неповрежденном)repo2
.Два альтернативных подхода, которые также работают с символами новой строки DOS (CR / LF) и позволяют довольно хорошо избегать двоичных файлов :
Общее решение, которое проверяет, что тип MIME начинается с
text/
:Решение для репозитория Git от Mat, в котором используется
-I
опцияgit grep
пропуска файлов, которые Git считает двоичными:источник
sed
опция суффикса-i
является необязательной , но в BSDsed
это не так . Здесь это, строго говоря, и не обязательно, поэтому я просто удалю его.В Баше:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
Примечание: Если вы используете
.git
репозиторий, попробуйте добавить:-not -iwholename '.git'
.источник
Это сработало для меня в OSX 10.5 Leopard, которая не использует GNU sed или xargs.
Просто будьте осторожны с этим, если у вас есть файлы, которые нужно исключить (я сделал)!
Вы можете использовать -prune, чтобы игнорировать определенные каталоги или файлы. Для файлов Python в репозитории git вы можете использовать что-то вроде:
источник
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
. Заменитеdir
каталог, о котором идет речь, как верхний уровень для рекурсии.sed -i .bak
? Разве не должно бытьsed -i.bak
(без пробела)?Ack был создан для такого рода задач.
Он работает так же, как grep, но знает, что нельзя спускаться в такие места, как .svn, .git, .cvs и т. Д.
Намного проще, чем прыгать через обруч с помощью find / grep.
Ack доступен через большинство менеджеров пакетов (как ack или ack-grep ).
Это просто программа на Perl, поэтому она также доступна в однофайловой версии, которую вы можете просто загрузить и запустить. См .: Подтверждение установки
источник
ack
это чудесно. Использовал его в течение нескольких лет и доступен почти во всех репозиториях пакетов для большинства дистрибутивов.ex
Попробуйте использовать редактор Ex (часть Vim):
Примечание. Для рекурсии (bash4 и zsh) мы используем новую опцию подстановки (
**/*.*
). Включитьshopt -s globstar
.Вы можете добавить в свой
.bash_profile
:sed
Для использования
sed
проверьте: Как удалить конечные пробелы с помощью sed?find
Найдите следующий скрипт (например
remove_trail_spaces.sh
) для удаления завершающих пробелов из файлов:Запустите этот сценарий из каталога, который вы хотите просканировать. В OSX в конце он удалит все файлы, заканчивающиеся на
.bak
.Или просто:
который рекомендуется в Spring Framework Code Style .
источник
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
удаляет только один конечный пробел вместо всех.В итоге я не использовал поиск и не создавал файлы резервных копий.
В зависимости от глубины дерева файлов этой (более короткой версии) может быть достаточно для ваших нужд.
ПРИМЕЧАНИЕ, например, это также относится к двоичным файлам.
источник
Вместо исключения файлов, вот вариант вышеупомянутого явно белого списка файлов, основанный на расширении файла, который вы хотите удалить, не стесняйтесь приправлять по вкусу:
источник
-name "*.rb*"
В итоге я запустил это, которое представляет собой смесь версий pojo и adams.
Он очистит как завершающие пробелы, так и другую форму конечных пробелов, возврат каретки:
Он не коснется папки .git, если она есть.
Edit : Сделано немного безопаснее после комментария, не позволяя принимать файлы с «.git» или «.svn» в нем. Но будьте осторожны, это будет касаться двоичных файлов , если у вас есть некоторые из них . Используйте
-iname "*.py" -or -iname "*.php"
после,-type f
если хотите, чтобы он касался, например, файлов .py и .php.Обновление 2 : теперь оно заменяет все виды пробелов в конце строки (что также означает табуляции)
источник
Это хорошо работает .. add / remove --include для определенных типов файлов:
источник
Рубин:
источник
Я использую регулярные выражения. 4 шага:
Это удаляет все конечные пробелы в конце каждой строки во всех файлах. И вы можете исключить некоторые файлы, которые не подходят для этой цели.
источник
1) Многие другие ответы используют
-E
. Я не уверен, почему, поскольку это недокументированный вариант совместимости с BSD .-r
следует использовать вместо этого.2) Остальные ответы использую
-i ''
. Это должно быть просто-i
(или-i''
если предпочтительнее), потому-i
что после него стоит суффикс.3) Конкретное решение Git:
Первый регистрирует псевдоним git, в
check-whitespace
котором перечислены файлы с конечными пробелами. Второй бежитsed
по ним.Я использую только
\t
вместо этого,[:space:]
поскольку обычно не вижу вертикальных вкладок, каналов форм и неразрывных пробелов. Ваш размер может отличаться.источник
Вот что работает для меня (Mac OS X 10.8, GNU sed, установленный Homebrew):
Удалены конечные пробелы, табуляция заменена пробелами, Windows CRLF заменена на Unix
\n
.Что интересно, я должен запустить это 3-4 раза, прежде чем все файлы будут исправлены, согласно всем
gsed
инструкциям по очистке .источник