示例文件内容:
--------------------
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///
) 应用于所有匹配的行。在第二种情况下,该命令使用空的正则表达式。这使它重用最近使用的正则表达式(在命令中)。替换与第一个命令中的相同。^HOST
g
vi
ed
s///
^HOST
g
与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
打印#
,后跟 之间的文本()
。