如何根据行开头的单词注释一行?

Gir*_*ara 5 sed vi

示例文件内容:

--------------------
NETWORKING=yes
HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------
Run Code Online (Sandbox Code Playgroud)

我想评论所有以“HOST”开头的行

Kus*_*nda 12

vi

:%s/^HOST/#&/
Run Code Online (Sandbox Code Playgroud)

或者

:g/^HOST/s//#&/
Run Code Online (Sandbox Code Playgroud)

%在“在整个缓冲区”的第一个命令的手段,而且是说的很短的方式1,$,即从第一行到最后。&在替换的替换部分中,将被与模式 ( ^HOST)匹配的整个文本替换。

第二个命令使用从行编辑器继承的全局 ( ) 命令将替换 ( s///) 应用于所有匹配的行。在第二种情况下,该命令使用空的正则表达式。这使它重用最近使用的正则表达式(在命令中)。替换与第一个命令中的相同。^HOSTgvieds///^HOSTg

sed

sed 's/^HOST/#&/' input >output
Run Code Online (Sandbox Code Playgroud)

或者

sed '/^HOST/s//#&/' input >output
Run Code Online (Sandbox Code Playgroud)

以与中相同的方式vised始终将所有命令应用于输入流的每一行,因此我们不使用类似%g显式的任何东西sed)。


删除以 开头的行的注释字符#HOST

sed 's/^#HOST/HOST/' input >output
Run Code Online (Sandbox Code Playgroud)

或者

sed '/^#HOST/s/.//' input >output
Run Code Online (Sandbox Code Playgroud)

在上述两个命令中的第二个中,该s///命令应用于所有以#HOST. 该s///命令只是删除该行的第一个字符。

vi两个命令的等价物是

:%s/^#HOST/HOST/
Run Code Online (Sandbox Code Playgroud)

:g/^#HOST/s/.//
Run Code Online (Sandbox Code Playgroud)

分别


Bri*_*n C 4

使用带有-i选项的 sed 就地编辑文件。(原件的备份副本将另存为file.txt.bak)。 sed -i.bak 's/^\(HOST.*\)/#\1/g' file.txt

读取正则表达式部分:^匹配行的开头。

()匹配的文本抓取到临时内部变量 ( \1) 中。

\在字符之前需要,(因为否则你的 shell 会窃取它们。

匹配.*0 个或多个字符。

因此,从行的前面开始,它匹配HOST后面跟着任何文本的字符串,直到换行符。如果该行不匹配,请保持原样。如果匹配,则将#\1打印#,后跟 之间的文本()