满足条件时注释掉文件中的行

满足条件时注释掉文件中的行

我可以通过 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

它将使您更加灵活地处理缺失行、标题和其他行的数量、客户端行之间的间距或随机排序。

对于就地编辑,请使用spongemoreutils如果您正在运行 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

相关内容