在vim中搜索并替换属性值

时间:2014-03-27 13:11:15

标签: vim

尝试在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

然后我想也许我应该添加非常神奇的开关,但是已经尝试过了,它似乎也没有用!我有什么问题?

3 个答案:

答案 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

正如赫德利所指出的那样。