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

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

示例文件内容:

--------------------
NETWORKING=yes
HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

我想注释所有以“HOST”开头的行

答案1

vi

:%s/^HOST/#&/

或者

:g/^HOST/s//#&/

第一个命令中的%表示“在整个缓冲区中”,是一种简短的说法1,$,即从第一行到最后一行。&替换部分中的替换将被模式 ( ^HOST) 匹配的整个文本替换。

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

sed

sed 's/^HOST/#&/' input >output

或者

sed '/^HOST/s//#&/' input >output

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


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

sed 's/^#HOST/HOST/' input >output

或者

sed '/^#HOST/s/.//' input >output

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

vi这两个命令的等效项是

:%s/^#HOST/HOST/

:g/^#HOST/s/.//

分别

答案2

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

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

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

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

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

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

答案3

Perl 1 衬垫:

perl -pe 's/^HOST/#$&/' file

或者,就地编辑文件:

perl -i -pe 's/^HOST/#$&/' file

解释

办法-pep应用 给出的脚本后打印每个输入行-e。是替换运算符,将在每行上s/foo/bar/替换第一个实例。在这里,我们用 a和匹配的内容(是存储匹配内容的特殊变量)替换以(表示行的开头)开头的行。所以,我们替换为.foobarHOST^#$&HOST#HOST

答案4

Perl 一行:

$ perl -ne 'if(/^HOST/){print "#$_"} else { print}' input.txt                                  
--------------------
NETWORKING=yes
#HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

这个简单的单行遍历所有行,检查行是否以以下开头HOST并附加到#它,否则我们转到else语句,它简单地打印未更改的行。

相同内容的 Python 版本如下:

python -c "import sys;print '\n'.join([ '#' + l.strip() if l.startswith('HOST') else l.strip()  for l in sys.stdin  ])" < input.txt

然而,它的工作方式略有不同,通过构建行列表(或数组),有条件地插入行本身或附加的行#。最终,该数组被连接成一个大字符串,其中的项目由换行符分隔,并打印出来。

相关内容