Как очистить кодовую базу, конечные пробелы, новые строки и т.д.

103
5

У меня есть база кода, которая заставляет меня гать с конфликтами из-за отстающих пробелов. Я хотел бы очистить его.


Я хочу:


    Удалить все конечные пробелы
    Удалить символы новой строки в конце файлов
    Преобразование всех строк в unix (dos2unix)

    Преобразуйте все ведущие пробелы в вкладки, т.е. 4 пробела к вкладкам.


    При игнорировании каталога .git.


Я нахожусь на OSX Snow Leopard и zsh.


до сих пор я:


sed -i "" 's/[ \t]*$//' **/*(.)

который отлично работает, но sed добавляет новую строку в конец каждого файла, к которому он прикасается, что нехорошо. Я не думаю, что sed можно остановить от этого, так как я могу удалить эти новые строки? Возможно, здесь есть какая-то магия awk.


(Полные ответы также приветствуются)

спросил(а) 2011-02-16T04:35:00+03:00 10 лет назад
1
Решение
105

[ИЗМЕНИТЬ: Исправлена ​​обрезка пробелов]
[РЕДАКТИРОВАТЬ # 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.

ответил(а) 2011-02-16T04:56:00+03:00 10 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема