web-dev-qa-db-ja.com

テキストファイルの同じ行の特定の文字列の後に文字列を追加します

テキストファイルの同じ行に文字列を追加しようとしています。私は以下の方法を使用しました。

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を使用して追加した文字列です。

しかし、問題は、多くの「メンバー」文字列を含む1つのテキストファイルがあることです。

例えば.

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_name HOSTGROUP ONE)にのみ文字列を追加します。この場合、hostgroup_nameを参照し、1つのタブで「members」文字列の後にテキストを追加するにはどうすればよいですか?

1
Buvanesh Kumar

2つのアプローチ:

sedアプローチ:

sed "0,/members/{s/\bmembers */&$Host, /}" printer.cfg
  • 0,/members/-1行目から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
}
1
RomanPerekhrest

関心のあるデータの範囲を選択、保存、および形成する3ステップのプロセスに従います。 stdoutへの印刷の最後のタスクは、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
0
user218374