使用 find 和 sed 刪除行尾字符

使用 find 和 sed 刪除行尾字符

對於從 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中未加引號的出現。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(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中顯示的命令就可以正常工作。

相關內容