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

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

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

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)にのみ文字列を追加しようとしています。この場合、タブを使用してホストグループ名を参照し、「メンバー」文字列の後にテキストを追加するにはどうすればよいですか?

答え1

2つの方法:

sed方法:

sed "0,/members/{s/\bmembers */&$host, /}" printer.cfg
  • 0,/members/members- アドレス範囲は、最初の行から始まり、最初のパターンが発生するまで一連の行を占めます。

アッ方法:

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

関連情報