为什么:%s/^ $ // g不等于:g/^ $/d在vim中?

it_*_*ure 1 regex vim

我想在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命令gs的概念是不同

:%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.

Ama*_*dan 7

不,这两个命令正在做不同的事情.:g/^$/d说"找到空行并删除它们",同时:s/^$//g意味着"在这个(当前)行中,用任何东西(仍然在同一行上)替换所有出现在线上的东西".正如你所注意到的,后者没有意义.

编辑为您的编辑:

^$不包含任何数据.字面意思是"行的开始,然后是行尾",其中"行"由Vim检测到.Vim就知道了\r\n\r\n(具体取决于文件和哪个OS创建它,并在Vim的选项)标志线的末端,并相应地对待它.该分离器位于之间^$.

这就像你说"我家里的房间" - 这(至少对我而言)不包括墙壁.当你说^$\n,你说的是"空荡荡的房间,还有旁边的木墙".s/^$//是"空的(已空的)房间"; s/^$\n//是"空荡荡的房间,打破它的墙".

相比之下,因为g它再也没有说什么\n.它找到空行(不关心任何分隔符),然后对它执行命令; 在您的情况下,命令是d:删除一行.它会删除整行(以及任何换行符).例如,如果你写:g/DELETEME/d,它会删除任何地方有DELETEME的行:它不关心匹配部分中的任何换行,它只是删除匹配的行.