
Для кодовой базы, преобразованной из java в scala, есть много файлов с ненужными точками с запятой в конце. Вот моя попытка их удалить:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done
(Примечание: использование gsed
since на 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, работает нормально.