我目前在 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 中也发现了同样的问题。
这是一个错误吗?如何规避这一问题?
答案1
编辑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
using Ctrl+VCtrl+M (这会键入文字回车符)。
在 GNUed
版本 1.18 及更高版本中,您还可以选择使用该--strip-trailing-cr
选项启动编辑器,该选项会在您打开文件时删除行末尾的任何单个尾随回车符。这正是s///
上面命令的作用。