Ascii
ed 不使用 ASCII 文本、CRLF、LF 行終止符連接行
我目前在 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
(這鍵入文字輸入)。在 GNU
ed
版本 1.18 及更高版本中,您還可以選擇使用以下選項啟動編輯器,該--strip-trailing-cr
選項會在您打開文件時從行尾刪除任何單個尾隨輸入符。這正是s///
上面的命令所做的。