Как очистить кодовую базу, конечные пробелы, новые строки и т.д.
У меня есть база кода, которая заставляет меня гать с конфликтами из-за отстающих пробелов. Я хотел бы очистить его.
Я хочу:
- Удалить все конечные пробелы
Удалить символы новой строки в конце файлов
Преобразование всех строк в unix (dos2unix)
Преобразуйте все ведущие пробелы в вкладки, т.е. 4 пробела к вкладкам.
При игнорировании каталога .git.
Я нахожусь на OSX Snow Leopard и zsh.
до сих пор я:
sed -i "" 's/[ \t]*$//' **/*(.)
который отлично работает, но sed добавляет новую строку в конец каждого файла, к которому он прикасается, что нехорошо. Я не думаю, что sed можно остановить от этого, так как я могу удалить эти новые строки? Возможно, здесь есть какая-то магия awk.
(Полные ответы также приветствуются)
[ИЗМЕНИТЬ: Исправлена обрезка пробелов]
[РЕДАКТИРОВАТЬ # 2: Слишком длинная строка с конца файла]
perl -i.bak -pe 'if (defined $x && /\S/) { print $x; $x = ""; } $x .= "\n" x chomp; s/\s*?$//; 1 while s/^(\t*) /$1\t/; if (eof) { print "\n"; $x = ""; }' **/*(.)
Эта строка завершает пустые строки из файла, но оставляет ровно один \n
в конце файла. Большинство инструментов ожидают этого, и оно не будет отображаться как пустая строка в большинстве редакторов. Однако, если вы хотите удалить последний последний \n
, просто удалите часть print "\n";
из этой команды.
Команда работает с помощью "сохранения" \n
символов до тех пор, пока не появится строка, содержащая непустой символ, - затем он печатает их все перед обработкой этой строки.
Удалите .bak
, чтобы избежать создания резервных копий исходных файлов (используйте на свой страх и риск!)
\s*?
совпадает с нулевым или более символом пробела, не относящимся к жадности, включая \r
, который является первым символом синтаксиса разрыва строки \r\n
DOS. В Perl $
соответствует либо в конце строки, либо непосредственно перед окончательным \n
, поэтому в сочетании с тем фактом, что *?
соответствует не-жадному (сначала попробуйте совпадение по ширине 0, затем 1- width match и т.д.), он делает правильные вещи.
1 while s/^(\t*) /$1\t/
- это всего лишь цикл, который многократно заменяет любые строки, начинающиеся с любого количества вкладок, за которыми следуют 4 пробела, с еще одной вкладкой, чем было, до тех пор, пока это невозможно. Таким образом, он будет работать, даже если некоторые строки были частично преобразованы в вкладки уже, если все символы \t
начинаются с столбца, делящегося на 4.
Я не видел синтаксис **/*(.)
до, предположительно, расширения zsh
? Если он работал с sed
, он будет работать с perl
.
Еще в рубрике
- Вопросы
- Removing-whitespace
- Как очистить кодовую базу, конечные пробелы, новые строки и т.д.