如何使用 vim 或 sed 在匹配模式之前插入字符?


int main () {
int a = 1;
}

更改为

#int main() {
#int a = 1;
#}

如何在每行之前插入"#"?

如果您只想在每行开头的(可能为空的(空格后面放置一个注释标记,则可以使用捕获组按照以下脚本获取它:

printf "int main () {n    int a = 1;n}n" | sed 's/^(s*)/1#/'
#int main () {
#int a = 1;
#}

更详细地说:

a  ccc   dd    <- markers, see below.
s/^(s*)/1#/
bb   bb   e   <- markers, see below.
  • 标记a(^字符(是起始行锚点,这意味着它只会在每行的开头操作。

  • 标记b((...)集(是一个捕获组,这意味着此模式捕获的任何文本都将被存储以供以后使用。

  • 标记c,即s*将匹配零个或多个空格字符。它位于捕获组内的事实意味着它将被存储。

  • 标记d是前面1指定的第一个捕获组。这将简单地将捕获的内容插入到替换字符串中。用于捕获组的数字可能很复杂,尤其是在层次结构中捕获时。但是,由于您在这里只捕获一件事,因此它相当简单。

  • 标记e只是要添加到捕获文本末尾的#

底线是它在每行的开头找到最大的空白部分,并将#字符附加到其中。


正如赛勒斯在评论中指出的那样,您还可以使用:

sed 's/[^ t]/#&/'

这将在每行的第一个非空格非制表符之前插入#

这应该为您完成:

:%s/(^.*$)/#1/g

我的尝试:

:%norm! _i#
% ......... hole file
nomrm! .... normal mode
_ ......... first non-blank of the line
i# ........ insert comment

一种使用块编辑的可能的 vim 方法

ggctrl-vGI#esc

gg开始,然后是ctrl+v,然后是GI。现在按下要插入的字符,#并用esc完成它

In vim: 首先通过按 Esc 键确保您未处于插入模式。 然后按冒号键并输入:

1,3s/^[ \t]*/&#/

这表示从第 1 行到第 3 行,在行的开头之后和一些可能的 空格和/或制表符,重复这些可能的空格和/或制表符并附加哈希 象征。

最新更新