テキストファイルの特定のタグ/文字列間のテキストを置き換えるbash / shスクリプト

テキストファイルの特定のタグ/文字列間のテキストを置き換えるbash / shスクリプト

/bin/sh または /bin/bash スクリプトを使用して実行する実行可能ファイルを作成しています。このような構造を含むファイルがあります。構成ファイルにはタグとタグが
1つしかありません。そのタグ間のテキスト、#start#end

...

#start
FirewallRuleSet global {
    FirewallRule allow tcp to google.com
    FirewallRule allow tcp to facebook.com

#more rules
}
#end

FirewallRuleSet known-users {
    FirewallRule allow to 0.0.0.0/0
}

...

希望の出力は次のとおりです。

...

#start
FirewallRuleSet global {
    FirewallRule allow tcp to google.com
    FirewallRule deny tcp to facebook.com
    FirewallRule deny tcp to twitter.com
    FirewallRule allow tcp to exaple.com



#more rules
}
#end

FirewallRuleSet known-users {
    FirewallRule allow to 0.0.0.0/0
}

...

#startその間のテキスト全体を新しいテキストに置き換えるには?#endこのプロファイルにルールを追加または削除したいです。

これは設定ファイルの一部であり、そのテキストで許可されているURLを変更したいと思います。

ベストアンサー1

使用

sed '/#start/,/#end/置換コマンド'

たとえば、ファイル名が指定されていて、myconfigそのセクションで「許可」を「拒否」に変更するには、次のように言うことができます。

sed '/#start/,/#end/s/allow/deny/' myconfig

これにより、ファイルは変更されずに残り、変更されたファイルの外観が標準出力に表示されます。コマンドが正しいことを確認するには、まずこれを行う必要があります。実際にファイルを変更するには、次を追加します。-iオプション:

sed -i '/#start/,/#end/s/allow/deny/' myconfig

変えたいならみんなテキスト(みんなテキスト)これら2行の間に次のことができます。ルーカスの答え:

sed '/#start/,/#end/c\
新しいテキスト行1\
新しいテキスト行 2\
        ︙\
新しいテキスト行N-1\
新しいテキスト行N(最終) '←引用符を閉じます。ここにはバックスラッシュはありません。

c~であるsed(およびed)のhangeコマンドは、「全体の改行」を意味します。単に#start合計線を変更せずにそのままにすることはできません#end。これを維持するには、再挿入する必要があります。

sed -i '/#start/,/#end/c\
#start\
FirewallRuleSet global {\
    FirewallRule allow tcp to google.com\
    FirewallRule deny tcp to facebook.com\
                      ︙                 \
\
#more rules\
}\
#end' myconfig

/#start/,/#end/#start 含める最初の行から含める最初の行までの範囲を指定します#end。これらの文字列のみを含め、他の文字列は含まれていない行を見つけるにはを使用してください/^#start$/,/^#end$/

おすすめ記事