Adicione string após uma certa string na mesma linha em um arquivo de texto

1

Eu tenho tentado adicionar uma string na mesma linha em um arquivo de texto. Eu usei o seguinte método.

sed -i "s/\bmembers\b/& \t$host,/" printer.cfg

Ele adicionará uma string após a string de membros e também adicionará uma tabulação para torná-la adequada.

Eu vou conseguir resultado assim,

define hostgroup{
hostgroup_name  HOSTGROUP ONE   
alias       Host Group 1 Printers
members     foo0, foo1, bar2, foo2, bar3
}

Onde foo0 é minha string adicionada usando o sed acima

Mas o problema é que há um arquivo de texto, que contém muitos caracteres "membros".

por exemplo,

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
}

Neste exemplo acima, quero adicionar uma string SOMENTE no primeiro para (hostgroup_name HOSTGROUP ONE). Neste caso, como posso referenciar hostgroup_name e adicionar texto após "membros" string com uma aba?

    
por Buvanesh Kumar 08.06.2017 / 07:05

2 respostas

1

Duas abordagens:

sed abordagem:

sed "0,/members/{s/\bmembers */&$host, /}" printer.cfg
  • 0,/members/ - intervalo de endereços que ocupa um intervalo de linhas a partir da 1ª linha até a primeira ocorrência de members pattern

awk abordagem:

awk -v h=$host '!f && /members /{ $2=sprintf("%8s, %s",h,$2); f=1 }1' printer.cfg

A saída (para ambas as abordagens):

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
}
    
por 08.06.2017 / 07:35
0

Siga o processo de três etapas de seleção, armazenamento e modelagem do intervalo de dados de interesse. A tarefa final de impressão para stdout é uma autotarefa de 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
    
por 08.06.2017 / 11:57