ChatGPT解决这个技术问题 Extra ChatGPT

在 vim 中多行查找和替换字符串

我可以用 :%s/<search_string>/<replace_string>/g 替换文件中的字符串,或者用 :s/<search_string>/<replace_string>/ 替换当前行。

如何从 vim 中的选择行中选择和替换单词?

示例:替换第 6-1014-18 行中的文本,而不是第 11-13 行中的文本。


C
Cine

全部替换:

:%s/foo/bar/g

查找每次出现的“foo”(在所有行中),并将其替换为“bar”。

对于特定行:

:6,10s/foo/bar/g

将第 6 行到第 10 行(含)的所有行的每个“foo”更改为“bar”。


/g 这里的目的是什么?对不起,我是 linux 新手
@RajaAnbazhagan 此表达式的最后一部分,在最后一个 / 之后,是您指示操作标志的位置。此命令通常会替换一行中的 first 匹配项;使用 g 标志,它将替换所有出现。
如果您要复制并复制他人的作品,您应该真正参考您的来源(即 vim.wikia.com/wiki/Search_and_replace)。
% 东西起作用了!否则,这只是第一次出现。
% =>在所有行上运行此命令。 g =>匹配同一行中的多次出现。
I
Ingo Karkat

:&& 命令使用相同的标志重复上次替换。您可以为其提供额外的范围(并根据需要连接任意数量):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

如果你有很多范围,我宁愿使用循环:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor

谢谢。未来用户的注意事项 - :6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&& 也可以使用,for 循环使其更易于记忆和执行。
很高兴你喜欢它!后续命令上的 : 是可选的,顺便说一句,因此您可以节省更多的击键。
:&& 每周可以为我节省数百次击键次数。谢谢!
它在我的 vim 末尾没有“g”的情况下工作。因此,也许当您指定行范围时,它不需要全局标志
@TayyarR 范围涵盖了行(可以说是垂直),而 'g' 标志确定是仅替换行内的一个或所有匹配项(因此水平)。
A
Attila O.

作为旁注,不必输入行号,只需突出显示要在其中一种视觉模式中查找/替换的行:

视觉模式 (V)

视觉块模式 (Ctrl+V)

VISUAL LINE 模式(Shift+V,最适合您的情况)

选择要替换的行后,键入命令:

:s/<search_string>/<replace_string>/g

您会注意到范围 '<,'> 将自动为您插入:

:'<,'>s/<search_string>/<replace_string>/g

这里 '< 仅表示第一个突出显示的行,而 '> 表示最后一个突出显示的行

请注意,在 NORMAL 模式下可能会出现意外行为:'<'> 指向在 VISUAL< 之一中完成的最后一个突出显示的开始和结束/strong> 模式。相反,在 NORMAL 模式下,可以使用特殊行号 .,它仅表示 当前行。因此,您只能在当前行上查找/替换,如下所示:

:.s/<search_string>/<replace_string>/g

另一件需要注意的是,在范围和查找/替换命令之间插入第二个 : 并没有什么害处,换句话说,这些命令仍然有效:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g

> 示例:替换第 6-10 行、第 14-18 行的文本,但不替换第 11-13 行的文本。 ——你的回答不是回答了这个问题,是吗?
这是一个很好的答案,可以直观地完成,而不是记下行号,谢谢:)
C
Community

搜索和替换

:%s/search\|search2\|search3/replace/gci

g => 全局搜索

=> 先请求确认

=> 不区分大小写

如果您想直接更换而无需确认,请使用以下命令

:%s/search/replace/g

如果您想确认每个替换,请运行以下命令

:%s/search/replace/gc

首先要求确认,这里搜索将不区分大小写。

:%s/search/replace/gci

S
Stephan

您可以使用两个查找/替换序列来完成

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

第二次你需要调整的是范围,所以我不会全部输入,我会回忆最后一个命令并只编辑范围


S
SMJ

在 vim 中,如果您对哪些行会受到影响感到困惑,请在下面使用

 :%s/foo/bar/gc  

将每个 'foo' 更改为 'bar',但首先要求确认。按“y”表示是,按“n”表示否。之后别忘了保存

:wq

除了指定范围之外,您实际上还可以使用 c 标志,因此 :6,10s/<search_string>/<replace_string>/c 有效。 c 代表 confirm。我经常使用 c 标志来防止意外替换我没有想到它们也存在的单词。
G
Gaurav Gandhi

VI 搜索和替换命令示例

假设您想找到一个名为“foo”的单词并替换为“bar”。

先按 [Esc]

键入:(冒号)后跟 %s/foo/bar/ 并按 [Enter] 键

:%s/foo/bar/


您的 :%s/<search_string>/<replace_string>/g 命令将替换整个文件中的所有匹配项。不完全是问题的答案,但仍然有用:)
@tanius 实际上,这是对我的问题最直接的答案。您可以考虑将问题修改为“Find and replace strings in vim on "Selected" lines”
l
lingjiankong

我们不需要费心输入当前行号。

如果您想将当前行 (.) 和下两行 (+2) 的每个 foo 更改为 bar,只需执行以下操作:

:.,+2s/foo/bar/g

如果您想在进行更改之前进行确认,请将 g 替换为 gc

:.,+2s/foo/bar/gc

我经常使用的另一个好东西是 :.,$s/foo/bar/gc 从当前行到文件末尾进行搜索和替换。
S
Saul Axel Martinez Ortiz

通过视觉选择指定范围是可以的,但是当操作员可以选择仅几行非常简单的操作时,最好将这些命令用作操作员。

遗憾的是,这不能通过标准的 vim 命令来完成。您可以使用 ! (过滤器)运算符和任何文本对象。例如,要将操作应用于段落,您可以执行以下操作:

!ip

这必须读作“在段落中应用运算符!”。过滤器运算符启动命令模式并自动插入行范围,后跟文字“!”您可以在之后删除。如果您将此应用于以下段落:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

按下“!ap”后的结果如下:

:.,.+5

作为'。 (point) 表示当前行,当前行和后面的5行之间的范围将用于操作。现在您可以像以前一样添加替换命令。

不好的部分是这并不容易选择文本以便稍后应用运算符。好的部分是,这可以重复插入其他类似文本范围(在本例中为段落)大小明显不同的范围。即,如果您以后要选择范围更大的段落,请使用“。”会正确的。

此外,如果您喜欢使用语义文本对象来选择操作范围的想法,您可以查看我的插件 EXtend.vim,它可以做同样的事情,但方式更简单。


Z
ZhaoGang

要回答这个问题:

:40,50s/foo/bar/g

在第 40 行和第 50 行(含)之间的这些行中将 foo 替换为 bar,当执行此命令时,您当前可以在任何行中。

:50,40s/foo/bar/g

也可以,vim 会要求您确认,然后为您进行替换,就像您输入了第一个命令一样。

:,50s/foo/bar/g

在您当前所在的行和第 50 行(含)之间的这些行中,将 foo 替换为 bar。 (如果你在第 50 行之后的一行,vim 会再次要求确认)

要明确 vim 和 Eclipse 的 vrapper 插件之间的区别:

请注意,在 varpper

:,50s/foo/bar/g 命令将不起作用。

:50,40s/foo/bar/g 无需确认即可工作。

(对于 Vrapper 版本 0.74.0 或更早版本)。


M
Martin Tournoij
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

假设您想用其他信息替换上面的内容。

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

在此上面将被替换为 (sys.pkg.mpu.umc.kdk.) 。


我不确定这是否真的回答了这个问题。从这个问题看来,提问的人已经知道如何使用 %s 来修改输入,但想知道如何“半全局”地进行(即他的规范是第 6-10 和 14-18 行,但不是第 11-13 行)。
还有什么是“命令”?而且您正遭受 leaning toothpick syndrome 的折磨。
要治愈这种综合症,您可以使用另一个字符作为分隔符而不是默认的 /,例如 !@_:%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g