代码之家  ›  专栏  ›  技术社区  ›  Nils

regex在vim中查找和替换:将.0添加到数字

  •  3
  • Nils  · 技术社区  · 14 年前

    我有一个文件,如下所示。

    1   1  0  #  1 
    6   1  0  #  2 
    8   1  0  #  3 
    10  1  0  #  4 
    12  1  0  #  6 
    

    除了后面的数字外,我如何才能将.0添加到所有数字中。我认为这不应该太难用正则表达式来做,但是我的正则表达式知识太生疏了。

    4 回复  |  直到 14 年前
        1
  •  7
  •   paxdiablo    14 年前

    如果你的号码在 # 后面没有空格,可以使用:

    :g/\([0-9]\+\) /s//\1.0 /g
    

    使用 () 创建可以引用为的组 \D 在替换文本中,其中 D 是组在搜索字符串中的位置。这将给您:

    1.0   1.0  0.0  #  1
    6.0   1.0  0.0  #  2
    8.0   1.0  0.0  #  3
    10.0  1.0  0.0  #  4
    12.0  1.0  0.0  #  6
    

    如果他们 在它们后面有空格(你的似乎有),你会得到:

    1.0   1.0  0.0  #  1.0
    6.0   1.0  0.0  #  2.0
    8.0   1.0  0.0  #  3.0
    10.0  1.0  0.0  #  4.0
    12.0  1.0  0.0  #  6.0
    

    在这种情况下,您可以这样做:

    :g/\.0\(  *\)$/s//\1/g
    

    把它修好。

        2
  •  8
  •   heijp06    14 年前

    用VIM:

    :%s/\v(#.*)@<!\d+/&.0/g
    

    说明: \v =非常神奇(见 help \v ) @<! 如果前面的原子在后面的内容之前不匹配,则与零宽度匹配(请参见 help \@<! )模式的其余部分将1个或多个数字的字符串替换为后面跟有 .0 .

        3
  •  1
  •   Anders    14 年前

    假设它是成形良好的,使用 sed 这应该有效。

    编辑:只是为了澄清, vim 当我看到这个问题的时候,它并没有贴上标签。

    sed 's/\([0-9]\+\) \+\([0-9]\+\) \+\([0-9]\+\)/\1.0 \2.0 \3.0/' file
    
        4
  •  0
  •   Raghuram    14 年前

    你也可以试试这个 sed's/[0-9]/&.0/g'sed's/.0[]*$/g'

    第一个sed add.0所有数字,第二个则删除尾随的.0