使用vim,我试图转换以下两行
output reg [1:0] abcd,
output reg efgh,
到
abcd
efgh
我正在使用正则表达式
:%s/\voutput|reg|\s*|\[.*\]|,//g
但是,我得到了输出,
[1:0]abcd,
efgh,
感谢任何帮助!谢谢。
答案 0 :(得分:3)
试试这个
\v\[.*]\s+|output\s+|reg\s+
答案 1 :(得分:3)
$xbd0
将在一条线上完成工作。你可以录制一个宏来自动在多行上进行。
答案 2 :(得分:3)
:help pattern
给出了理由(尽管从预先暴露于不同的可能性中猜到了原因有很大帮助: - )
1. A pattern is one or more branches, separated by "\|". It matches anything
that matches one of the branches. Example: "foo\|beep" matches "foo" and
matches "beep".
的If more than one branch matches, the first one is used.
强>
Vim的正则表达式匹配器是第一匹配引擎。 POSIX要求最左边的时间。纯粹主义者可能认为其他任何东西都不是正则表达式匹配器,而只是一个“模式匹配器”,这可能与vim称之为“模式”有关... sed
和perl
是最长的:
$ sed -r 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh
$ perl -ple 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh
但是使用第一匹配引擎你必须做一些不同的事情。重新排序您的替代品,它的工作原理:
:%s/\voutput|reg|\[.*\]|,|\s*//g
将\s*
替换为\s+
会使其对订单不敏感:
:%s/\voutput|reg|\s+|\[.*\]|,//g
Vim的g
标志似乎取代了第一个匹配分支的每次出现,然后重试,直到没有任何变化。
只是为了完整和混乱,
:%s/\v(reg|output|\s*|\[.*\]|,)*//
abcd,
efgh,
和
:%s/\v(reg|output|\s*|\[.*\]|,)*//g
abcd
efgh
根据上面推导出的规则,对我来说实际上对我有意义。
(编辑:gawk
s gensub
和nvi
s extended
引擎显然也是最长时间的
答案 3 :(得分:1)
正则表达式中的问题是您要求\ s *的部分。这意味着“没有或许多空白”。由于整个正则表达式是一个大的OR,然后Vim将开始消耗你的字符串,直到它找到至少一个空格。当发生这种情况时,它将再次从OR的开头开始匹配并重复该过程。因此,这意味着在\ s *之后尝试接收的任何表达式都将被忽略,因为\ s *可以消耗尽可能多的表达式,直到找到空白字符。要验证这一点,请注意,如果更改\ s *的位置,您将得到不同的结果,这样只会消除\ s *之前的表达式。
我相信你真正想要的正则表达式是:
:%s/\voutput|reg|\s+|\[.*\]|,//g
表示您要替换至少有空格的地方。这对我来说很好。
答案 4 :(得分:1)
你的正则表达式无效的原因。
似乎vim从左到右读取正则表达式并尝试按顺序匹配联合的每个部分。
所以output|reg|\s*|\[.*\]|,
永远不会到达\[.*\]
,因为空字符串与每个字符之间的\s*
匹配。由于vim正则表达式引擎匹配的东西,它立即进行替换。
如果您只是重新排序\s*
的联合,那么正则表达式将按预期工作。
所以命令应该是:%s/\voutput|reg|\[.*\]|,|\s*//g
答案 5 :(得分:0)
这样可行(在结尾附近查找4个字母):
%s/^.*\<\(\a\{4}\),\s*$/\1/g