パターンと一致し、それに続く最初の文字列インスタンスを置き換えます(スペースやタブに関係なく)。

パターンと一致し、それに続く最初の文字列インスタンスを置き換えます(スペースやタブに関係なく)。

しばらく前に同様の質問をしましたが、うまく機能しないのに苦労しています。

次のように構成ファイルを変更するためのスクリプトを作成しています。

[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/_}'

内部アドレス指定のために最後のパターンを再利用します。

関連情報