Как удалить конечные пробелы в конце строки в заданных файлах (более одного)?

9

Мне так надоели бесполезные пробелы в исходных файлах, которые я даже настроил для показа в vim.

Проблема в том, что мне очень часто (если не всегда) приходится сталкиваться с бесполезными пробелами с моими помощниками-разработчиками.

Я просто хотел бы сканировать исходные файлы (с учетом регулярного выражения) и удалять пробелы из всех указанных файлов.

Я поискал в Интернете ("bash remove whitespace" и т. Д.), Но не нашел ничего полезного.

Оливье Понс
источник
2
Удалить какие пробелы? Без примера того, что вы хотите удалить, я не понимаю, как кто-то может вам помочь. (Полагаю, tr -d ' ' < file.fooэто не совсем то, что вы ищете.)
Мат
Как программно определить разницу между бесполезными пробелами и полезными пробелами? Кстати, вы можете использовать для цикла и mv и sed и свернуть пробел;
BSD
Вы также можете удалить конечные пробелы, когда сохраняете свои файлы в vim (избавляя вас от необходимости повторно запускать эту команду после того, как вы что-то отредактируете): unix.stackexchange.com/questions/75430/…
Lucas

Ответы:

8

Если под бесполезным пробелом вы подразумеваете конечный пробел в конце строки, это будет работать в системах GNU:

find -name '*.c' -print0 | xargs -r0 sed -e 's/[[:blank:]]\+$//' -i

(замените *.cвсе, что совпадают ваши исходные файлы)

Деннис Каарсемакер
источник
Я изменил название, большое спасибо за ваш ответ. Кто-то проголосовал, потому что, может быть, он подумал, что это так просто, что никто не должен задавать такой вопрос ;^). Еще раз спасибо
Оливье Понс
1

Это повторяющаяся проблема!

perl -i -pe 's/\s+\n/\n/'  ./*.c

(это также удаляет ' \r\n')

Я обычно использую немного более сложную версию "nrs" (без лишних пробелов):

#!/usr/bin/perl -pi
s/\h*(\r\n|\n|\r)/\n/g;                 ## normalize \n (DOS, MAC)
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;  ## remove BOM !

установить его: chmod 755 nrs; cp nrs ~/bin; (или аналогичный)

и использовать: nrs ./*.c

Не используйте его в двоичных файлах!

JJoao
источник
0

Попробуйте Ex-way:

ex +'bufdo!%s/\s\+$//e' -scxa *.*

удалить конечные пробелы из всех файлов в текущей папке. Для рекурсии (bash4 / zsh) вы можете использовать новую опцию globbing ( **/*.*).

Примечание: :bufdoкоманда не POSIX .

kenorb
источник
примечание: bufdo - это не POSIX. pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Стивен Пенни,
0

Чтобы не трогать файлы, которые уже в порядке, с помощью инструментов GNU:

grep -rlZ --binary-files=without-match --include='*.c' '\s$' . |
  xargs -r0 sed -i 's/\s+$//'
Стефан Шазелас
источник