我想在gvim for windows中删除文件中的空白行(不是来自cygwin的vim).
:g/^$/d # delete all blank lines correctly
:%s/^$//g #can not delete all blank lines
Run Code Online (Sandbox Code Playgroud)
这是一个如何表达行尾的问题,
我已经用命令详细检查了我的文件%!xxd,
我发现在每一行的末尾有一个0d0a,
当行的结尾由特殊字符表示时$,
它是否包含该0D0A?
表达the end of line命令g和 s的概念是不同的?
:%s/^$\n//g #delete all blank lines correctly
Run Code Online (Sandbox Code Playgroud)
它混淆了我^$将包含特殊字符\r\n ,也许^$在s 命令中不包含特殊字符\r\n,但^$在g 命令中包含特殊字符\r\n.哪个位置有特殊性能 $指向?在... \r\n之前或之后\r\n.
不,这两个命令正在做不同的事情.:g/^$/d说"找到空行并删除它们",同时:s/^$//g意味着"在这个(当前)行中,用任何东西(仍然在同一行上)替换所有出现在线上的东西".正如你所注意到的,后者没有意义.
编辑为您的编辑:
在^$不包含任何数据.字面意思是"行的开始,然后是行尾",其中"行"由Vim检测到.Vim就知道了\r\n或\r或\n(具体取决于文件和哪个OS创建它,并在Vim的选项)标志线的末端,并相应地对待它.该分离器位于之间的^$.
这就像你说"我家里的房间" - 这(至少对我而言)不包括墙壁.当你说^$\n,你说的是"空荡荡的房间,还有旁边的木墙".s/^$//是"空的(已空的)房间"; s/^$\n//是"空荡荡的房间,打破它的墙".
相比之下,因为g它再也没有说什么\n.它找到空行(不关心任何分隔符),然后对它执行命令; 在您的情况下,命令是d:删除一行.它会删除整行(以及任何换行符).例如,如果你写:g/DELETEME/d,它会删除任何地方有DELETEME的行:它不关心匹配部分中的任何换行,它只是删除匹配的行.