用同一行中的其他字符串替换字符串

时间:2017-06-05 17:42:18

标签: string text replace line vi

Vi编辑器

输入文件文本格式:

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

必需的输出文本格式:

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

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

2 个答案:

答案 0 :(得分:1)

您可以在vim中使用宏。类似的东西:

/\.^Mly$?'^MPj0

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

i)搜索点

/\.^M

ii)向右移动一个角色,然后猛拉到线的末尾

ly$

iii)反向搜索引用:'

?'^M

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

Pj0

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

2@q

(注意:^M<Enter>

Action Gif

答案 1 :(得分:1)

使用替换命令和捕获组可以非常简单地完成此操作。试试以下正则表达式:

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

这样说,搜索引号'',然后捕获到第1组\(.*\),然后是文字点\.,然后捕获到第2组{ {1}} 的。这将是

\(.*\)

进入第1组,

: hello

进入第2组。然后我们将其替换为引号CodeN 中的第2组,然后是第1组'\2',然后再加上一个点\1和第二组{{ 1}}

如果你把\.放在正则表达式的开头,你就可以摆脱很多反斜杠并使它更具可读性:

\2

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

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

这说,在每一行上,执行以下按键%normal向前移动到'。' :%norm f.ly$0p ,向右移动一个字符:%norm,将所有内容移到此行f.的末尾,移至此行l的开头,然后粘贴我们刚才猛烈y$