示例文件内容:
--------------------
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)
以与中相同的方式vi(sed始终将所有命令应用于输入流的每一行,因此我们不使用类似%或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)
分别
使用带有-i选项的 sed 就地编辑文件。(原件的备份副本将另存为file.txt.bak)。
sed -i.bak 's/^\(HOST.*\)/#\1/g' file.txt
读取正则表达式部分:^匹配行的开头。
将()匹配的文本抓取到临时内部变量 ( \1) 中。
\在字符之前需要,(因为否则你的 shell 会窃取它们。
匹配.*0 个或多个字符。
因此,从行的前面开始,它匹配HOST后面跟着任何文本的字符串,直到换行符。如果该行不匹配,请保持原样。如果匹配,则将#\1打印#,后跟 之间的文本()。