2

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

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

(Примечание: использование gsed так как на Mac sed - это мусор ..)

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

Обратите внимание, что работает на одном файле, как:

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

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

3 ответа3

1

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

Если в прошлом у вас был плохой опыт работы с MacPorts и Fink, то Homebrew совсем не такой. В самом деле. OSX без Homebrew - это как Windows без Cygwin. Ну не совсем; Но ты получил идею.

1

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

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .