/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$/
。