テキストファイルの同じ行に文字列を追加しようとしています。私は以下の方法を使用しました。
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」文字列の後にテキストを追加するにはどうすればよいですか?
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
}
関心のあるデータの範囲を選択、保存、および形成する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