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

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

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

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

[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変数に対して置換を実行できます。

おすすめ記事