1

私は最近、ファイルを snmp デーモンにロードするプロセスをすべてのステップで自動化するシェル スクリプトを作成しました。

最後に、サーバー上の conf ファイルを編集する必要があり、正規表現を使用する必要があることに気付きました。

特定の範囲の行に挿入する必要があるすべてのコンテンツを含む zfiles.txtという名前のファイルを作成しました。

snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

snmptt_conf_files = <<ENDとの間のすべてENDを の内容に置き換える必要がありzfiles.txtます。

ところで、誰かが正規表現を学ぶための優れたリソースを提供してくれれば、本当に感謝しています。

前もって感謝します

4

2 に答える 2

2

私は awk (gnu) ワンライナーを思いつきました。

 awk 'NR==FNR{r=$0;next}/END$/&&!f{print;f=1;next}!f{print}/END$/&&f{print r $0;f=0}' RS="\0" zfile.txt RS="\n" file

少しテストしてみましょう:

kent$  cat file
snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

keep1
keep2
keep3

snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

kent$  cat zfile.txt
replace1
replace2
replace3

ワンライナーを実行します。

kent$  awk 'NR==FNR{r=$0;next}/END$/&&!f{print;f=1;next}!f{print}/END$/&&f{print r $0;f=0}' RS="\0" zfile.txt RS="\n" file
snmptt_conf_files = <<END
replace1
replace2
replace3
END

keep1
keep2
keep3

snmptt_conf_files = <<END
replace1
replace2
replace3
END

ワンライナーがあなたのために仕事をしているようです。正規表現リソースに関しては、Google で検索すると 10k を超える結果が得られると思います。好きなものを取り、やって学ぶ。

于 2013-05-03T00:03:26.080 に答える
1
sed '/snmptt_conf_files = <<END/,/END/{     # for a here-doc block:
  /^END$/b          # if at the end skip rest
  /<<END/!d         # if not first line delete and skip rest... else insert file:
  r zfiles.txt
}' input

リソースに関しては、Jeffrey EF Friedl による Mastering Regular Expressions は堅実な本です。

于 2013-05-03T00:03:44.087 に答える