尝试在Vim中进行简单的搜索和替换,然后惨遭失败。我的意见是:
<column name="ID" type="numeric(19,0)" autoIncrement="true"/>
<column name="TSTAMP" type="datetime"/>
<column name="AMOUNT" type="numeric(19,2)"/>
<column name="CURRENCY" type="varchar(255)"/>
<column name="GAINED_MONEY" type="boolean"/>
<column name="ADJUSTMENT_REASON_ID" type="numeric(19,0)"/>
<column name="ADJUSTMENT_TX_ID" type="numeric(19,0)"/>
我想用name属性的内容替换每一行,得到:
ID
TSTAMP
AMOUNT
CURRENCY
GAINED_MONEY
ADJUSTMENT_REASON_ID
ADJUSTMENT_TX_ID
我的第一次尝试是:
:%s/.*name="\(\S+\)".*/\1/g
然后我想也许我应该逃避逃脱序列:
:%s/.*name="\(\\S+\)".*/\1/g
然后我想也许我应该添加非常神奇的开关,但是已经尝试过了,它似乎也没有用!我有什么问题?
答案 0 :(得分:3)
这种替换似乎适用于您的样本:
:%s/\v^.{-}"(.{-})".*/\1
故障:
\v --- 'very magic' because who likes backslashes?
^ --- anchor the pattern to the start of the line
.{-}" --- match any character non-greedily until the next "
(.{-})" --- match any character non-greedily until the next "
and put it into capture group \1
.* --- match the rest of the line
/\1 --- replace the whole line with capture group \1
答案 1 :(得分:3)
现在有一些完全不同的东西
:%norm di"Vp
:normal
在一系列行上运行普通命令di"
将删除第一个属性内容Vp
会将当前行替换为刚刚删除的内容如需更多帮助,请参阅:
:h :norm
:h v_p
答案 2 :(得分:0)
图I我将把这个用于额外的解释,不使用\v
非常神奇的符号,我们可以看到\{-}
是一个非贪婪的搜索(所以尽可能少的字符而不是很多尽可能这样:
:%s/.*name="\(.\{-}\)".*/\1/g
此外,如果我们可以在括号中添加非空白字符\S
而不是通配符.
:
:%s/.*name="\(\S\+\)".*/\1/g
正如赫德利所指出的那样。