使用 find 和 sed 删除行尾的字符

使用 find 和 sed 删除行尾的字符

对于从 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中未加引号的出现。echogsed

在这种情况下,幸运的是,编写可靠运行的代码很容易:只需使用 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 中显示的命令就可以正常工作了。

相关内容