
對於從 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
做工作。
答案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(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中顯示的命令就可以正常工作。