我可以通过 vi 在文件中注释掉某些行。在数百个文件中执行此操作是一项艰苦的活动。我可以通过 sed 或 awk 来设置一个条件吗?例如,我想设置一个条件注释掉所有行其中有这个client-ca-gh.ef.cd.1
及以后。
该文件有近500行,其中client1-100有100行,从1递增到100。所有文件都是一样的,唯一的区别是由于文件中有一些空格,行号不一样不匹配。例如,在一个文件中 client5 位于第 3 行,而在另一个文件中,它可能位于第 4 行。否则我会对所有具有行范围的文件使用 sed
:3,5s/client/#client
1 client-ca-gh.ef.cd.1
2 client-ca-gh.ef.cd.2
3 #client-ca-gh.ef.cd.3
4 #client-ca-gh.ef.cd.4
5 #client-ca-gh.ef.cd.5
答案1
更通用的解决方案使用awk
对于像这样的文件:
header
header
client-ca-gh.ef.cd.1
client-ca-gh.ef.cd.4
client-ca-gh.ef.cd.2
client-ca-gh.ef.cd.3
other stuff
client-ca-gh.ef.cd.5
more stuff
我们可以 a) 搜索带有 的行client-ca-gh.ef.cd.
,然后 b) 如果最后一个数字高于给定值,我们注释掉该行。
awk -F. '/^client-ca-gh\.ef\.cd\./ { if ($NF >= 3) {$0="#"$0}} {print}' file
结果:
header
header
client-ca-gh.ef.cd.1
#client-ca-gh.ef.cd.4
client-ca-gh.ef.cd.2
#client-ca-gh.ef.cd.3
other stuff
#client-ca-gh.ef.cd.5
more stuff
它将使您更加灵活地处理缺失行、标题和其他行的数量、客户端行之间的间距或随机排序。
对于就地编辑,请使用sponge
或moreutils
如果您正在运行 GNU awk ( gawk
) 就地选项:
awk -F. 'AWK CODE' file | sponge file
awk -i inplace -F. 'AWK CODE' file
答案2
如果我理解正确,您可以使用 来执行此操作sed
,假设该模式client<number>$
仅出现在这些行上。使用其他示例内容:
local-ip 0.0.0.0 site-client1
foo
local-ip 0.0.0.0 site-client2
local-ip 0.0.0.0 site-client3
local-ip 0.0.0.0 site-client4
local-ip 0.0.0.0 site-client5
foo
local-ip 0.0.0.0 site-client6
local-ip 0.0.0.0 site-client7
local-ip 0.0.0.0 site-client8
local-ip 0.0.0.0 site-client9
...
$ sed -e '/client[0-9]*$/s/^/#/' -e 's/^#\(.*client[1-2]\)$/\1/' file
local-ip 0.0.0.0 site-client1
foo
local-ip 0.0.0.0 site-client2
#local-ip 0.0.0.0 site-client3
#local-ip 0.0.0.0 site-client4
#local-ip 0.0.0.0 site-client5
foo
#local-ip 0.0.0.0 site-client6
#local-ip 0.0.0.0 site-client7
#local-ip 0.0.0.0 site-client8
#local-ip 0.0.0.0 site-client9