2017-04-19 8 views
0

初めてbashスクリプトを作成しようとしていて、設定ファイルを変更するのにsedを使用しています。私が編集する必要のあるキーはかなり一般的で、ファイル全体で使用されているので、セクションに触れてどこに触れているか知る必要があります。sedを使ってテキスト全体を処理する

したがって、ファイルの周りには、[section name]と宣言されているセクションが複数あり、そのセクションの設定が1つのタブでインデントされています。ファイル全体に使用されるenabledtypeなどのキーがあります。

だから、完全なセクションでは、次のようになります。

[backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

をだから私は何をする必要があるかです:

  1. のコメントを外し、セクション全体
  2. 変更enabled = no
  3. enabled = yesに変更 destinationポートを持つIPアドレスへの値( 192.168.99.38:2003
  4. hostnameの値を別のホスト名(マシンのホスト名($HOSTNAME?))に変更してください。

これはまったく問題に取り組んでいません。私はsedのマルチライン処理について見てきましたが、私は間違いなく[backend]セクションにマッチする方法がわかりません。これは私にとってとても新しいものです。

ヘルプは高く評価されます。

+0

だから、唯一の '[バックエンド]それが存在するかどう'あなたはすべてのセクションを編集する以下の設定を編集したいです'[section-name']の下に? –

+0

@ k-five '[backend]'の下にあるものだけ、それ以外は何もありません。申し訳ありませんが十分に明確ではない、 – Aborted

+0

@Inian私はあなたの答えを見ることができません。私は以前のものを見て、それを適用しようとしていましたが、今は消えてしまいました。 – Aborted

答えて

1

あなたは私をコメントとして:だけ何も

、[バックエンド]の下で何が

Perlでこれを行うと興味があります。でない場合はとコメントしてください。私は削除し、答えます。このワンライナーがあなたのためにそのセクションを見つけ

[no-backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

[backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

[no-backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

perl -lne '$b=$.; $e=($b+10) if /\[backend\]/;print if $b++<$e' file 

or readable version 
perl -lne 'if(/\[backend\]/){ $b=$.; $e=($b+10); }; if($b++ < $e){ print }' file 

と出力:代わりに、今

[backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

は、あなたがこのファイルを持っていると言います 印刷あなたのcaその後、

[no-backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 
[backend] 
     enabled = yes 
     data source = average 
     type = graphite 
     destination = 192.168.99.38:2003 
     prefix = netdata 
     hostname = $HOSTNAME 
     update every = 10 
     buffer on failures = 10 
     timeout ms = 20000 

[no-backend] 
     # enabled = no 
     # data source = average 
     # type = graphite 
     # destination = localhost 
     # prefix = netdata 
     # hostname = localhost 
     # update every = 10 
     # buffer on failures = 10 
     # timeout ms = 20000 

、最終的にはすべてが良かった場合は出力をチェックした後:

s/#//;s/no/yes/;s/(?<=destination =).+$/192.168.99.38:2003/;s/(?<=hostname =).+$/$HOSTNAME/ 

フルワンライナー

perl -lpe 'if(/\[backend\]/){$b=$.;$e=($b+10);};if($b++<$e){ s/#//;s/no/yes/;s/(?<=destination =).+$/192.168.99.38:2003/;s/(?<=hostname =).+$/\$HOSTNAME/ }' file 

と出力:nのそのセクションを変更あなたは-iオプションを使用して、次のような場所の編集機能を使用できます。

perl -i.bak -lne '...the rest of the script...' file

.bakは、古いファイルのバックアップを取得するためのものです。 (のような:file.txt.bak)あなたのコメント

perl -lpe '$hn=qx(cat /etc/hostname);chomp $hn;if(/\[backend\]/){$b=$.;$e=($b+10);};if($b++<$e){s/#//;s/no/yes/;s/(?<=destination =).+$/192.168.99.38:2003/;s/(?<=hostname =).+$/$hn/ }' file 

と出力のための


UPDATE

... 
... 
[backend] 
     enabled = yes 
     data source = average 
     type = graphite 
     destination = 192.168.99.38:2003 
     prefix = netdata 
     hostname = k-five 
     update every = 10 
     buffer on failures = 10 
     timeout ms = 20000 
... 
... 
+0

私はPerlを気にしません。私はそれがすべてのUbuntuのバージョンでデフォルトでインストールされていることは確かです。しかし、1つの質問: '' [no-backend] 'セクションは何ですか? – Aborted

+0

@AbortedほとんどのLinuxディストリビューションには、デフォルトで** Perl **とUbuntuもあります。 '[no-backend]'はちょうど一致してはならない別のセクションです。ちょうど確かに –

+0

ああ、申し訳ありませんが、私はそれを得ませんでした。あなたの助けをありがとう! – Aborted

1

sedは、原料のこの種のための理想的なツールではありませんが、それは行うことができます。

/^\[.*]$/h 
{G;/\n\[backend\]$/{ 
    s/#// 
    /enabled/s/no/yes/ 
    /destination/s/localhost/whatever/ 
    /hostname/s/localhost/something else/ 
    } 
    s/\n\[.*\]$// 
} 
1

テキストがconfigfileをしていると仮定すると、 "["で始まる部分の下に別のセクションがあります。下の解決策はうまくいくはずです

sed -i '/\[backend\]/,/\[/{s/#//;s/enabled = no/enabled = yes/;s/\(destination = \)\(.*\)\($\)/\1192\.168\.99\.38\:2003\3/;s/\(hostname = \)\(.*\)\($\)/\1'$HOSTNAME'\3/}' configfile 

[バックエンド]と[との間のテキストを検索し、{}で囲まれたsedコマンドを実行します。#を削除してから、宛先と最終的にホスト名を編集します。

バックエンド以下は他のセクションが存在しない場合は、にコマンドを変更します。

sed -i '/\[backend\]/,/^$/{s/#//;s/enabled = no/enabled = yes/;s/\(destination = \)\(.*\)\($\)/\1192\.168\.99\.38\:2003\3/;s/\(hostname = \)\(.*\)\($\)/\1'$HOSTNAME'\3/}' configfile 
関連する問題