我一直在尝试在文本文件的同一行中添加一个字符串。我使用了以下方法。
sed -i "s/\bmembers\b/& \t$host,/" printer.cfg
它将在成员字符串后添加一个字符串,并且还会添加制表符以使其正确。
我会得到这样的结果,
define hostgroup{
hostgroup_name HOSTGROUP ONE
alias Host Group 1 Printers
members foo0, foo1, bar2, foo2, bar3
}
其中 foo0 是我使用上面的 sed 添加的字符串。
但问题是有一个文本文件,其中包含许多“成员”字符串。
例如
define hostgroup{
hostgroup_name HOSTGROUP ONE
alias Host Group 1 Printers
members foo1, bar2, foo2, bar3
}
define hostgroup{
hostgroup_name HOSTGROUP TWO
alias 2nd Host Group
members example1, example3, example2
}
在上面的示例中,我只想在第一段(主机组名称 HOSTGROUP ONE)中添加字符串。在这种情况下,如何使用一个选项卡引用主机组名称并在“members”字符串后添加文本?
答案1
两种方法:
sed方法:
sed "0,/members/{s/\bmembers */&$host, /}" printer.cfg
0,/members/
members
- 地址范围占据从第一行开始到模式第一次出现的一系列行
awk方法:
awk -v h=$host '!f && /members /{ $2=sprintf("%8s, %s",h,$2); f=1 }1' printer.cfg
输出(两种方法):
define hostgroup{
hostgroup_name HOSTGROUP ONE
alias Host Group 1 Printers
members foo0, foo1, bar2, foo2, bar3
}
define hostgroup{
hostgroup_name HOSTGROUP TWO
alias 2nd Host Group
members example1, example3, example2
}
答案2
按照选择、存储和塑造感兴趣数据范围的 3 个步骤进行操作。打印到标准输出的最终任务是 的自动任务sed
。
host='Foo_0';
sed -Ee '
# Step-1: SELECT RANGE
/^define hostgroup[{]/,/^[}]/!b
# Step-2: SAVE RANGE DATA
H; /^define hostgroup[{]/h; /^[}]/!d
# Step-3: SHAPE RANGE DATA
g;/\nhostgroup_name\s+HOSTGROUP ONE/s/\nmembers\s+/&'"${host}"', /
' printer.cfg