Vim 在可视模式下替换

Vim 在可视模式下替换

在这样的测试块中

cron.allow
cron.deny

我想用 at 代替 cron,仅在视觉模式(ctrl+v)选择的范围内所以我按 ctrl+v : 并出现 !提示“好的,我愿意”

sed s:cron:at:gc

但我只看到这个错误

:'<,'>! sed s:cron:at:gc
shell end return code 1
7 lines filteerd

以及返回后的结果

sed: expression -e #1, caracther 12: option `s' unknown

为什么?

答案1

一旦进入visual block选择线路的模式,请尝试以下操作:

:'<,'>s/cron/at/g

Vim 具有搜索和替换功能,无需调用外部命令。

答案2

从命令行观察是否成功:

$ echo cron | sed s:cron:at:
at

但这并没有:

$ echo cron | sed s:cron:at:c
sed: -e expression #1, char 11: unknown option to `s'

c不是一个sed选择。不过,以下内容将起作用:

:'<,'>! sed s:cron:at:g

但是,当然,没有必要sed在 vim 中进行如此简单的替换。此外,如果您想要c(确认),请使用 vim 的内置替换命令:

:'<,'>s/cron/at/gc

答案3

看来你根本不需要使用 sed 或替代品。只需使用change ( c) 命令即可。从文档中:

Visual-block change                       *v_b_c*
All selected text in the block will be replaced by the same text string.  When
using "c" the selected text is deleted and Insert mode started.  You can then
enter text (without a line break).  When you hit <Esc>, the same string is
inserted in all previously selected lines.

这里的关键是,“当您点击 时<Esc>,相同的字符串将插入到之前选择的所有行中。”因此,您所要做的就是块选择文本cron,按c,键入,退出插入模式,您将获得将块中的at每个替换为 的所需结果。cronat

如果您确实想在块上运行替换命令,我会将该块剪切并粘贴到一些空白行,在这些行上运行替换,然后将生成的块剪切并粘贴回其原始位置。

您问题中的命令的问题是您正在尝试使用 external sed,并且s命令 insed不接受c标志。

相关内容