![如何根据行开头的单词来注释行?](https://linux22.com/image/102893/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E8%A1%8C%E5%BC%80%E5%A4%B4%E7%9A%84%E5%8D%95%E8%AF%8D%E6%9D%A5%E6%B3%A8%E9%87%8A%E8%A1%8C%EF%BC%9F.png)
示例文件内容:
--------------------
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///
匹配的所有行,该命令继承自行编辑器。在第二种情况下,该命令使用空正则表达式。这使得它重用最近使用的正则表达式(在命令中)。替换与第一个命令中的相同。^HOST
g
vi
ed
s///
^HOST
g
和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
解释
办法-pe
p应用 给出的脚本后打印每个输入行-e
。是替换运算符,将在每行上s/foo/bar/
替换第一个实例。在这里,我们用 a和匹配的内容(是存储匹配内容的特殊变量)替换以(表示行的开头)开头的行。所以,我们替换为.foo
bar
HOST
^
#
$&
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
然而,它的工作方式略有不同,通过构建行列表(或数组),有条件地插入行本身或附加的行#
。最终,该数组被连接成一个大字符串,其中的项目由换行符分隔,并打印出来。