Ascii

ed 不使用 ASCII 文本、CRLF、LF 行終止符連接行

  • June 25, 2022

我目前在 Windows 上的 Debian WSL 中執行 Gnu ed 1.18 版。如果我編輯具有以下編碼的文件:

ASCII text, with CRLF, LF line terminators

或者

ASCII text, with CRLF,

然後 ed 沒有正確地將行與j command. 相反,它刪除了要連接的第一行。

如果文件是在 ed 中創建的,則不會出現此問題,但它確實會影響在其他程序中創建並隨後在 ed 中編輯的文件。在 GNU ed 1.17 中也發現了同樣的問題。

這是一個錯誤嗎?如何規避這個問題?

ed編輯器將假定該文件是一個 Unix 文本文件。當出現 DOS 文本文件(帶有 CRLF 行結尾的文件)時,它會將每行末尾的輸入字元視為任何其他字元。

這意味著,如果您有一個如下所示的 DOS 文本文件(此處使用,l以明確的方式列出文件,輸入顯示為可見\r,每個行尾顯示為$),

line 1\r$
line 2\r$
line 3\r$

…然後使用2,3j將第三行連接到第二行的末尾,你會得到

line 1\r$
line 2\rline3\r$

ed輸出line 2\rline3\r到終端時,游標通過嵌入在行中間的文字輸入字元移回行首,這給人的印像是文本line 2消失了(實際上它被覆蓋line 3)。

解決方案是使用工具將您的文件轉換為 Unix 文本dos2unix,或者使用從編輯器中刪除所有單個尾隨輸入符

,s/^M$//

…您鍵入^M的位置Ctrl+V``Ctrl+M (這鍵入文字輸入)。

在 GNUed版本 1.18 及更高版本中,您還可以選擇使用以下選項啟動編輯器,該--strip-trailing-cr選項會在您打開文件時從行尾刪除任何單個尾隨輸入符。這正是s///上面的命令所做的。

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