对于从 Java 转换为 Scala 的代码库,许多文件末尾都有不必要的分号。以下是我尝试删除它们的方法:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done
(注意:gsed
在 Mac 上使用 sincesed
是垃圾..)
然而,这根本不起作用——分号没有被删除。
请注意,在单个文件上运行如下:
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
这有效直到你有一个文件名包含空格或其他 shell 活动字符。对于其中之一,shell 将同时执行单词拆分和路径名扩展的输出$(find . -name \*.scala)
。即使没有这个,shell 也会执行单词拆分 和路径名扩展在和命令$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/;$//;' {} +
答案2
您可能只想dos2unix
在运行 sed 之前运行所有这些。您可能会问如何获取 dos2unix?好吧,这是在这里添加另一个答案的主要原因(因为我还没有足够的代表来添加评论)。如果您想在 OSX 上生存,您需要Homebrew 包管理器。安装 Homebrew(2 分钟)后的第一件事是更新 bash!! OSX 多年来没有更新过 bash。使用它您可以更新 unix 实用程序。
如果您过去使用 MacPorts 和 Fink 时有过不愉快的经历,那么 Homebrew 并不是那样的。真的。没有 Homebrew 的 OSX 就像没有 Cygwin 的 Windows。好吧,事实并非如此;但您明白我的意思。
答案3
我找到了原因:文件中有^M
(DOS 样式CRLF
) - 所以首先我必须这样做:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done
然后 OP 中显示的命令就可以正常工作了。