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