我从这个 Stack Overflow 问题中了解到,可以使用vi/vim注释掉指定范围的行号。例如,假设我有以下 bash 脚本:
#!/bin/bash
This
is
my
very
very
great
script
Run Code Online (Sandbox Code Playgroud)
现在假设我想通过8注释掉行号6(包含单词very,very和great)使用#注释字符。在vi/ 中vim,我可以简单地输入:6,8s/^/#以获得以下内容:
#!/bin/bash
This
is
my
#very
#very
#great
script
Run Code Online (Sandbox Code Playgroud)
其中注释掉了第 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
Run Code Online (Sandbox Code Playgroud)
这似乎表明我实际上正在使用vim. 我正在使用 SSH 从我的 PC 访问远程 Ubuntu Linux 集群。我没有使用 Ubuntu Linux GUI。
jof*_*fel 24
您可以使用:
:6,8s/^#//
Run Code Online (Sandbox Code Playgroud)
但是使用 Block Visual 选择模式要容易得多:转到第 6 行的开头,按Ctrl-v,转到第 8 行并按x。
还有“NERD评论者”插件。
我知道您的问题指定使用vi或vim但这里有一些其他选项,无需手动打开文件:
珀尔
perl -ne 'if($. <=8 && $. >= 6){s/^\s*#//;}print' foo.sh
Run Code Online (Sandbox Code Playgroud)Perl 版本 >=5.10
perl -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh
Run Code Online (Sandbox Code Playgroud)
这将打印出文件的内容,您可以重定向到另一个 ( > new_file.sh) 或用于i就地编辑文件:
perl -i -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh
Run Code Online (Sandbox Code Playgroud)sed
sed '6,8 s/^ *#//' foo.sh
Run Code Online (Sandbox Code Playgroud)
同样,要使此编辑原文件到位,请使用i:
sed -i '6,8 s/^ *#//' foo.sh
Run Code Online (Sandbox Code Playgroud)awk/gawk等:
gawk '(NR<=8 && NR>= 6){sub("^ *#","")}{print}' foo.sh
Run Code Online (Sandbox Code Playgroud)纯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
Run Code Online (Sandbox Code Playgroud)