【问题标题】:replace a string with other string in the same line用同一行中的其他字符串替换一个字符串
【发布时间】:2017-11-06 13:32:18
【问题描述】:

Vi 编辑器

输入文件文本格式:

'': hello.Code1
'': hello.Code2
'': hello.Code3

所需的输出文本格式:

'Code1': hello.Code1
'Code2': hello.Code2
'Code3': hello.Code3

想法是我必须复制“。”之后的所有值。到单引号''。我可以使用基于 Linux 的 Vi 或 SED 等。或基于 MAC。 我在文本文件中有超过 2000 行 谢谢

【问题讨论】:

    标签: string text replace line vi


    【解决方案1】:

    这可以通过替换命令和捕获组非常简单地完成。试试下面的正则表达式:

    :%s/''\(.*\)\.\(.*\)/'\2'\1.\2
    

    这表示,搜索引号 '',然后是捕获到第 1 组 \(.*\) 的任何内容,然后是文字点 \.,然后是捕获到第 2 组 \(.*\) 中的任何内容 .这会放

    : hello
    

    进入第 1 组,并且

    CodeN
    

    进入第 2 组。因此,我们将其替换为 第 2 组,引号 '\2',然后是第 1 组 \1,然后是点 \.,第 2 组又是 \2。

    如果你把\v放在正则表达式的开头,你可以去掉很多反斜杠,让它更具可读性:

    :%s/\v''(.*)\.(.*)/'\2'\1.\2
    

    您也可以使用%normal 命令执行此操作。这使得一组击键应用于缓冲区中的每一行。我会试试这个:

    :%norm f.ly$0p
    

    这就是说,在每一行上,执行以下击键:%norm 前进到“。” f.,向右移动一个字符l,将所有内容拉到这一行的末尾y$,移动到这一行的开头0,并粘贴我们刚刚拉出的内容p

    【讨论】:

    • 宏解决方案没有问题,但考虑到 2000 多行,宏可能会很慢
    【解决方案2】:

    您可以在 vim 中使用宏。比如:

    /\.^Mly$?'^MPj0
    

    假设您在第一行的开头。开始录制。要记录到q 寄存器,请点击qq,然后:

    i) 搜索点

    /\.^M
    

    ii) 向右移动一个字符,然后拉到行尾

    ly$
    

    iii) 反向搜索引用:'

    ?'^M
    

    iv) 粘贴内容并向下一行移动到开头。

    Pj0
    

    然后您可以重复该操作。假设您将其记录在q 寄存器中:

    2@q
    

    (注意:^M 是 <Enter>)

    【讨论】:

    • 我有 2000 行要替换。
    • 好吧,假设它的结构相似,你可以这样做2000@q。
    • 它对我不起作用。 E486:未找到模式:.^Mly$?'^MPj0
    • 你录好了没?停留在行首,然后点击qq 开始录制。
    • 您将其全部粘贴并按回车键。你需要一步一步地去做。首先,转到第一行的开头,点击qq开始录制。 (应该说“录音”)在下面。然后输入/\. 并回车。你现在应该是点字符。点击l,这样你就成为右边的一个角色......等等。全部完成后,按q 停止录制。
    猜你喜欢
    • 2017-01-02
    • 2019-12-07
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多