题
如何将一行中的前十个字符替换为上面一行中的前十个字符,其中这十个字符与特定模式匹配?
编辑:目前尚不清楚我是否要求替换匹配可能出现在行内任何位置的前十个字符,因此如果涉及这种情况,请在答案中记下(将此情况称为情况 B,将预期的情况称为情况 A) ?)
解决方案
Prehaps:
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
其中'abcdefghij'是第二行的10个字符串
其他提示
这样的事情会起作用:
%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/
其中 ^。\ {10 \}
是您的实际模式。
%s/ # substitute all lines matching…
^.\{10\} # your pattern
/ # …with…
\= # an expression:
strpart( # gets the part of a string
get( # gets an element of a list
getbufline( # gets a list of lines from the current buffer
"", line(".")-1) # getbufline() the line before the current line
, 0, "") # get() first line in buffer, default to ""
, 0, 10) # strpart() first ten characters
/ # …end of substitution
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
2,$
是我们的范围(因为第一行没有前一行)g//
允许您在与给定模式匹配的行上运行命令。s/^.\{10}/
将替换一行的前 10 个字符\=
让您可以将 vim 表达式的结果替换为:s//
line(".")
是当前行号getline(line(".")-1)
是上一行的文本strpart(getline(line(".")-1),0,10)
是上一行的前 10 个字符
例如 2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
会改变:
我喜欢吃ing mangos 油炸前ing frogs legs 我希望我ad a puppy 她给了Dad a frog
对此:
我喜欢吃ing mangos 我喜欢吃ing frogs legs 我希望我ad a puppy 我希望我ad a frog
如果我有类似的复杂动作,我通常使用 q
命令录制宏。像(未经测试)的东西:
/<pattern>
qq
10x
k
10yl
j
P
n
q
然后重复发出该宏为 @q
,可选择以计数为前缀。
您可以使用搜索和替换:
:7,9 s/foo/bar/c
此示例在每次出现'foo'时从第7行到第9行搜索,并将其替换为'bar',要求每次点击确认。如果您不想确认,请将c放在最后。根据您的需要选择范围,这可以让您找到您想要的地方
仅使用 vim 的动作和拉/粘贴..鉴于文件内容..
1234567890abcdef
qwertyuiopasdfgh
将光标放在 q 上, 10x
, ,文件变为:
1234567890abcdef
asdfgh
将光标移动到第一行(使用 k
会做),然后做 10yl
(猛拉 10 个字符,右)
然后向下移动一行, j
, ,并粘贴 P
(大写,粘贴到光标下)并且文件变为:
1234567890abcdef
1234567890asdfgh
简而言之,从光标在 q 上开始:
10xk10yljP
..您可以粘贴或分配 到宏
如果有一个明显的覆盖粘贴的快捷方式会更短,但我找不到这样的东西
另一种选择是看起来非常晦涩的正则表达式搜索/替换。
Visual-line 选择两个目标行,然后运行以下搜索和替换:
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
基本上都是抢到的..
\1
- 整个第一行\2
- 前 10 个字符(在嵌套组中)- 换行符
\3
- 第二行的前十个字符\4
- 第二行的其余部分
然后它将两条线构造为 \1\n\2\4
- 完成第一行、换行符、第一行的前 10 个字符、第二行的剩余部分