しばらく前に同様の質問をしましたが、うまく機能しないのに苦労しています。
次のように構成ファイルを変更するためのスクリプトを作成しています。
[Thing1]
[[subthingA]]
this = 0
that = string
and = localhost
the = 80
other = 0
thing_ading = /path/to/a/dir
[Thing2]
[[subthingB]]
this = 0
thing_ading = /path/to/dir
here = 0
これにはN個の[モノ]があり、通常は同じキーおよび/またはキー/値ペアの値があり、[[サブアイテム]]の下のキー/値ペアは正確に8マスインデントされています。私は特に、thing_ading
以下の値をSubthingB
別のディレクトリパスに変更するawk/sed/grep/tr/cut/perlを使用して1行のコードを作成しようとしています。
すべてを編集してthing_adings
特定のペアをターゲティングできますが、空白が原因で問題が発生します。
答え1
sed
これらの問題を解決するには、範囲演算子を使用できます,
。
sed -e '
/^\[Thing2]$/,/^$/!b
/^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
- まず、誤った範囲をスキップして正しい範囲を選択してください。
- その後、適切なスコープにあるときに、必要なthing_ding変数に対して置換を実行できます。
答え2
これはsed
文章です:
sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file
ブロックのみを操作するには、subthingB
インデント後から次の行まで[[subthingB]]
すべてを処理します。[
このブロックの場合、バックスラッシュの置き換えによって読み取れなくなるのを防ぐために、代わりにコマンド区切り文字を使用thing_ading
して行のアドレスを指定して置換を実行します。_
/
s
subthingB
ブロックに項目があることが保証されると、thing_ading
次のように単純化できます。
sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'
内部アドレス指定のために最後のパターンを再利用します。