私はsedの置き換えを試みており、現在これを行うために2つのコマンドを使用しています。これら2つのコマンドを組み合わせて、一度に単語を正しく置き換える方法を知りません。
ここで私がすることは、sc_admin
単語があるすべての場所に追加することですadmin
。
私が考えることができるすべての単語の組み合わせは次のとおりです。
access = read : [ admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin ]
access = read : [ admin, somerole ], write : [ admin, power ]
だから私は現在、交換を実行するために2つのsedコマンドを使用しています。
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *]/, sc_admin ]/' infile
読み取り部分ではadminという単語を正しく置き換えますが、書き込み部分では置き換えません。
例えば
access = read : [ admin, sc_admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ *, sc_admin ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power ]
access = read : [ defadmin, somerole, sc_admin ], write : [ admin, power ]
しかし、
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *] *$/, sc_admin ]/'
このコマンドは、書き込み部分にadminという単語を正しく追加し、読み取り部分には何もしません。
access = read : [ admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole ], write : [ admin, power, sc_admin ]
access = read : [ defadmin, somerole ], write : [ admin, power ]
そのため、現在のファイルを回復するために1つのコマンドを実行してから、2番目のコマンドを実行しています。正しい出力を得るためにコマンドを結合するための確実な方法はありますか?
これが私が望む実際の出力です。
access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]
答え1
次のコマンドを使用して、次の操作を実行できますsed
。
$ sed 's/\(\[ admin[^]]*\) /\1, sc_admin /g' file
access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]
\(\[ admin[^]]*\)
文字列「[admin <not]」と最後のスペース>のすべての文字をキャプチャします。これを行うには、間に含まれる文字をキャプチャして() ']'以外の文字を選択する\(...\)
ために使用します。[^]]*
^
\1, sc_admin
キャプチャされたグループ(\1
)に置き換えて、「sc_admin」を追加します。