Удаление символов в конце строк с помощью find и sed

Удаление символов в конце строк с помощью find и sed

Для кодовой базы, преобразованной из java в scala, есть много файлов с ненужными точками с запятой в конце. Вот моя попытка их удалить:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done

(Примечание: использование gsedsince на Mac sed— мусор ..)

Однако это просто не выполняет задачу — точки с запятой не удаляются.

Обратите внимание, что запуск одного файла, например:

for f in  $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done

делаетработа.

решение1

Никогда не используйте это:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Это работаетдоу вас есть файл, имя которого содержит пробелы или другие активные символы оболочки. Во-первых, оболочка выполнит обаразделение словирасширение имени путина выходе $(find . -name \*.scala). Даже без этого оболочка будет выполнятьразделение слов ирасширение имени путио некавычках вхождениях $fв команды echoи gsed.

В этом случае, к счастью, легко написать код, который будет работать надежно: просто используйте -execопцию find:

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +

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

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +

решение2

Вы можете просто захотеть запустить все это dos2unixперед запуском sed. Как получить dos2unix, вы можете спросить? Ну, это главная причина добавить еще один ответ здесь (и потому что у меня пока недостаточно репутации, чтобы добавлять комментарии). Если вы хотите выжить в OSX, вам нужноМенеджер пакетов Homebrew. Первое, что нужно сделать после установки Homebrew (2 минуты) —обновить bash!! OSX не обновляла bash годами. С этим вы можете обновить утилиты unix.

Если у вас был неудачный опыт с MacPorts и Fink в прошлом, Homebrew не такой. Серьёзно. OSX без Homebrew — это как Windows без Cygwin. Ну, не совсем; но вы поняли.

решение3

Я нашел причину: в файлах был ^M(стиль DOS CRLF) - поэтому сначала мне пришлось сделать:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Затем команда, показанная в OP, работает нормально.

Связанный контент