如果连接它们(用“|”),为什么这些命令会失败?

时间:2014-03-10 08:59:48

标签: regex vim

转过来:

·     阿富汗 Country1

·     阿爾及利亞 Country2

·     孟加拉 Country3 

*  ·  不丹 Country4 (請參閱下列*說明處)

进入这个:

Country1,Country2,Country3,Country4

我执行以下操作:

%s/[^\x00-\x7F]//g

删除中文字符。

%s/\s\+$//g

删除尾随空格

%s/\s\+//g

删除剩余的白人步伐

g/^$/d

删除空行

%s/\n/,/g

将每一行连接成一行(每个单词用逗号分隔)。

现在我想在一个命令中执行此操作。所以我连接了所有这些命令:

%s/[^\x00-\x7F]//g|%s/\s\+$//g|%s/\s\+//g|g/^$/d|%s/\n/,/g 

产生这个:

Country1,Country2,,Country3,,Country4,

我发现它很奇怪,因为如果我单独使用它们,命令就会起作用。

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

并非所有Ex命令都可以连接。某些命令(如:global命令)本身可以接受一系列命令,因此会占用所有剩余的参数,包括|命令分隔符。有关此类命令的列表,请参阅:help :bar。如果您确实希望在序列中包含此类命令,则帮助还提供了解决方案:您需要将命令本身与:execute括起来。适用于您的问题,这将成为:

%s/[^\x00-\x7F]//g|%s/\s\+$//g|%s/\s\+//g|exe 'g/^$/d'|%s/\n/,/g

这样,最后一个:s命令应用于整个缓冲区,而不是:global命令的范围。

答案 1 :(得分:2)

怎么样:

%s/[^\x00-\x7F]\|\s//g|%s/\n\{2,}/,/g