Решения тех проблем, с которым мне приходилось сталкиваться.

среда, 28 декабря 2011 г.

удаление лишних пробелов в конце строки

Задача из области написания кода. Часто случается так, что в конце строки образуются лишние пробелы. Как их быстрее всего увидеть и удалить? Приходит на помощь sed.

На первый взгляд, задача тривиальна:

sed -ri 's/\s+$//g' foobar


Но есть в ней одна засада. Если исходный файл foobar имеет переводы строк системы DOS/Windows (т.е. два символа CR-LF), то символ \r в unix системах будет трактован тоже как пробел и соответственно удален. В итоге вместе с пробелами поменяются и переводы строк. Что может быть нежалательно.

Правильнее будет сделать так:
sed -ri 's/ +(\r)?$/\1/g' foobar


В данном случае мы запоминаем, был ли в конце строки символ \r и заменяем последовательность пробелов (именно пробелов, а не вообще пробельных символов) на этот символ (или его отсутствие, если исходный файл с переводами *nix).

Ну и еще пара моментов. Флаг -r, расширенные регулярные выражения, просто чтобы не писать лишние бэкслеши. Флаг -i замена файла in-place, т.е. и поток будет прочитан из файла и записан в него же.

Ну и наконец команда, чтобы выполнить данную операцию для всех файлов директории.
find . -name '*.java' -exec sed -ri 's/ +(\r)?$/\1/g' \{\} \;