如何用上面一行的前十个字符替换这十个字符与特定模式匹配的行的前十个字符?
编辑:不清楚我是否要求替换匹配可能出现在该行中任何位置的前十个字符,所以如果它处理这种情况,可能会在你的答案中记下(将此情况称为 B 和预期的情况案例A?)
也许:
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
其中 'abcdefghij' 是第 2 行的 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)
会改变:
我喜欢在炸青蛙腿 之前吃芒果 我希望我有一只小狗 她给了 D一只青蛙
对此:
我喜欢吃芒果 我喜欢吃青蛙腿 我希望我有一只小狗 我希望我有一只青蛙
如果我有这样的复杂动作,我通常会使用q
命令录制宏。类似(未经测试):
/<pattern>
qq
10x
k
10yl
j
P
n
q
然后重复地发出该宏作为@q
可选的前缀计数。
您可以使用搜索和替换:
:7,9 s/foo/bar/c
此示例从第 7 行到第 9 行搜索每次出现的 'foo',并将其替换为 'bar',要求对每次命中进行确认。如果您不想确认,请将 c 放在末尾。选择您认为合适的范围,这应该可以让您到达您想要的位置
仅使用 vim 的动作和拉/粘贴.. 给定文件内容..
1234567890abcdef
qwertyuiopasdfgh
将光标放在 q, 上10x
,文件变为:
1234567890abcdef
asdfgh
将光标移动到第一行(使用k
will 执行此操作),然后执行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 个字符,第二行的剩余部分