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

时间:2018-10-24 04:30:06

标签: vim sed

int main () {
  int a = 1;
}

更改为

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

如何在每行之前插入“#”?

5 个答案:

答案 0 :(得分: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就是您要添加到捕获的文本末尾的#

最重要的是,它在每行的开头找到了最大的空白部分,并在其后附加了#字符。


Cyrus在评论中指出,您还可以使用:

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

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

答案 1 :(得分:0)

这应该为您做到:

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

答案 2 :(得分:0)

我的尝试

:%norm! _i#

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

答案 3 :(得分:0)

可能使用块编辑的vim方法

ggctrl-vGI#esc

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

完成

答案 4 :(得分:0)

在vim中: 首先,请按退出键以确保您未处于插入模式。 然后按冒号键并输入:

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

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