在文本文件中同一行的某个字符串后面添加字符串

在文本文件中同一行的某个字符串后面添加字符串

我一直在尝试在文本文件的同一行中添加一个字符串。我使用了以下方法。

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

相关内容