我目前在 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
,每个行尾显示为$
),...然后使用
2,3j
将第三行连接到第二行的末尾,你会得到当
ed
输出line 2\rline3\r
到终端时,光标通过嵌入在行中间的文字回车字符移回行首,这给人的印象是文本line 2
消失了(实际上它被覆盖了line 3
)。解决方案是使用工具将您的文档转换为 Unix 文本
dos2unix
,或者使用从编辑器中删除所有单个尾随回车符...您键入
^M
的位置Ctrl+VCtrl+M (这键入文字回车)。在 GNU
ed
版本 1.18 及更高版本中,您还可以选择使用以下选项启动编辑器,该--strip-trailing-cr
选项会在您打开文件时从行尾删除任何单个尾随回车符。这正是s///
上面的命令所做的。