Sed

sed 無意中更改了 Windows 行尾。我怎樣才能避免這種情況?

  • October 19, 2018

我正在 linux 中開發一個可移植的應用程序,我想從一些源文件中刪除尾隨空格,這些文件具有 windows 樣式的行結尾。行尾不應更改為 unix。

使用“sed”的程式碼很簡單,可以在網上找到:

sed -i.bak -E 's/[[:space:]]+$//' myfile

問題是在操作之後,diff文件中的所有行(以及生成的 .bak)都不同。這當然不可能。特定文件只有 1 行帶有尾隨空格。

使用 hexdump(我使用過od -x myfile)實用程序進行檢查,很明顯原始文件的第一行以 “0d0a” 結尾,而在 sed 編輯的文件中,它以 “0a” 結尾。

我無法找到有關如何在不影響行尾的情況下執行尾隨空格刪除的任何資訊。有辦法嗎?

如果“輸入”字元是“

$$ [:space: $$]" 正則表達式組,那麼也許這個

sed -i.bak -E 's/[ \t]+$//' myfile

應該管用。但它沒有 - 它創建一個相同的文件。我也嘗試過“-e”標誌,甚至根本沒有標誌。生成的文件仍然與原始文件相同,並且沒有刪除尾隨空格。

是的,(\r = ^M = 0x0D) 字元屬於space“字元類”。在您的第二個正則表達式中允許它使用萬用字元:

sed -i.bak -E 's/[ \t]+.$/\r/' myfile

或特定的字元,例如

sed -i.bak -E 's/[ \t]+\r$/\r/' myfile

如果您sed不認識該\r符號,請嘗試其他。像十六進製\x0D或八進制\015

引用自:https://unix.stackexchange.com/questions/476582