使用 vi 或 vim 注释掉由行号指定的多行代码

使用 vi 或 vim 注释掉由行号指定的多行代码

我从中学到了这个堆栈溢出问题可以使用vi/vim注释掉指定范围的行号。例如,假设我有以下 bash 脚本:

#!/bin/bash

This
is
my
very
very
great
script

现在假设我想使用注释字符注释掉第 6 行到第 8 行(其中包含单词veryverygreat#。在vi/中vim,我只需键入:6,8s/^/#即可获取以下内容:

#!/bin/bash

This
is
my
#very
#very
#great
script

其中注释掉了第 6 行到第 8 行。

我的问题是,是否有可能键入一个类似的衬里消除第 6 行到第 8 行的注释字符#(但不是文件中的任何其他注释行)?

vi话虽如此,我意识到关于我是否实际上使用或存在一些争论vim。在实践中,我script.sh使用命令打开一个文件vi script.sh。另外,当我输入命令时which vi,我得到了/usr/bin/vi.然而,当我简单地输入vi并按下时Enter,我得到了这个:

~                              VIM - Vi IMproved
~
~                               version 7.2.330
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                           Sponsor Vim development!
~                type  :help sponsor<Enter>    for information
~
~                type  :q<Enter>               to exit
~                type  :help<Enter>  or  <F1>  for on-line help
~                type  :help version7<Enter>   for version info

这似乎表明我实际上正在使用vim.我正在使用 SSH 从我的 PC 访问远程 Ubuntu Linux 集群。我没有使用 Ubuntu Linux GUI。

答案1

您可以使用:

:6,8s/^#//

但使用 Block Visual 选择模式要容易得多:转到第 6 行开头,按Ctrl-v,向下转到第 8 行,然后按x

还有“书呆子评论家”插入。

答案2

我知道您的问题指定使用vi或,vim但这里有一些其他选项可以执行此操作,而无需手动打开文件:

  • 珀尔

    perl -ne 'if($. <=8 && $. >= 6){s/^\s*#//;}print' foo.sh 
    
  • Perl 版本 >=5.10

    perl -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    

    这将打印出文件的内容,您可以重定向到另一个 ( > new_file.sh) 或使用i就地编辑文件:

    perl -i -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    
  • sed

    sed '6,8 s/^ *#//' foo.sh
    

    同样,要就地编辑原始文件,请使用i

    sed -i '6,8 s/^ *#//' foo.sh
    
  • awk/ gawkETC:

    gawk '(NR<=8 && NR>= 6){sub("^ *#","")}{print}' foo.sh
    
  • 纯的bash

    c=1; while read line; do 
      if [ $c -ge 6 ] && [ $c -le 8 ]; then 
         echo "${line/\#/}"
      else 
         echo $line 
      fi
      let c++; done < foo.sh
    

答案3

vi是大多数 GNU/Linux 发行版中的符号链接,因此当您键入 时,vim您确实正在使用.vimvi

要删除注释,您可以键入::6,8s/^#//:6,8s/^\s*#//删除# 符号前的一些前导空格。

答案4

您可能正在使用vim.tiny.无论如何,您可以通过以下方式删除最初的评论:

:6,8s/^#//

当然,如果您以不同的方式插入它们(例如,使用额外的空格),您可能需要删除其中的其他内容。使用完整的 vim,直观地选择列和插入/删除字符是完成相同操作的更简单的方法。

相关内容