我目前在 Windows 上的 Debian WSL 中运行 Gnu ed 版本 1.18。如果我使用以下编码编辑文件:
ASCII text, with CRLF, LF line terminators
Run Code Online (Sandbox Code Playgroud)
或者
ASCII text, with CRLF,
Run Code Online (Sandbox Code Playgroud)
那么 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$
Run Code Online (Sandbox Code Playgroud)
...然后使用2,3j
将第三行连接到第二行的末尾,您将得到
line 1\r$
line 2\rline3\r$
Run Code Online (Sandbox Code Playgroud)
当ed
输出line 2\rline3\r
到终端时,光标通过嵌入在行中间的文字回车符移回行首,这给人的印象是文本line 2
消失了(实际上它被覆盖)line 3
。
解决方案是使用诸如 之类的工具将文档转换为 Unix 文本dos2unix
,或者使用以下命令从编辑器中删除所有单个尾随回车符
,s/^M$//
Run Code Online (Sandbox Code Playgroud)
...您在其中键入^M
using Ctrl+VCtrl+M (这会键入文字回车符)。
在 GNUed
版本 1.18 及更高版本中,您还可以选择使用该--strip-trailing-cr
选项启动编辑器,该选项会在您打开文件时删除行末尾的任何单个尾随回车符。这正是s///
上面命令的作用。
归档时间: |
|
查看次数: |
482 次 |
最近记录: |