期待される出力をクリーンアップする方法は?

期待される出力をクリーンアップする方法は?

背景:私はAMCE.shと管理されているネットワークスイッチ間の接続にExpectを使用しています。スイッチにSSH経由でログインしてコマンドを実行できますが、スイッチがSSL証明書を管理する方法のため、毎回新しいCSRを作成する必要があります。コマンドを実行すると、CSR がダウンロード可能なファイルではなく端末に表示されます。 ACME.shに供給できるように、CSRをファイルとして保存する必要があります。

実際の問題:

Expectスクリプトには以下が含まれています。その目的は、スイッチがCSRをファイルにエクスポートしたときに出力をキャプチャし$csr、最後の行が入ったときにキャプチャを停止することです。

send -- "command to generate CSR"
send -- "\r"
log_file -noappend $csr
expect -- "-----END CERTIFICATE REQUEST-----"
log_file

うまく動作し、ファイルを取得しました。問題は、ターミナルから追加のゴミの山を取得することです(下の例、一般に約KBの追加のゴミ)。私はgrep `を介してこれを供給しようとしましたが、sedz or彼らは私が抽出したいものの複数行の特性を処理できないようです。

^[[68;33Hc^[[68;33H^[[?25h^[~~~~~~*SNIP*~~~~~~[[?25h^[[68;1H^[[1;68r^[[68;1H-----BEGIN CERTIFICATE REQUEST-----^M
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM^M
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC^M
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP1^M
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==^M
-----END CERTIFICATE REQUEST-----^M
^[[1;68r^[[68;1H^[[68;1H^[[2K^[[68;1H^[[?25h^[[68;1H^[[68;1Hswitch1.home.domain.uk(config)# ^[[68;1H^[[68;33H^[[68;1H^[[?25h^[[68;33H

実行するとcat test.csrほとんどのファイルをきれいに取得できますが、 を使用して必要なものを抽出しようとすると、sed必要なものと一致するように取得できません。私が試したことの例sed -E 's/([\s\S]*)(-----BEGIN CERTIFICATE REQUEST-----[\s\S]*-----END CERTIFICATE REQUEST-----)([\s\S]*)/\2/m;t;d' test.csr

[68;33Hc                         {end of command to generate CSR}
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTE~~~~~~*SNIP*~~~~~~moRRarVThXnbcF0a5nvGQtU8j7jP1
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----

簡単に言えば、必要なきちんとした出力をどのように取得するのか、またはsed後に整理できる他のツールを入手したり、他のツールを取得したりする方法は何ですか?

答え1

正規表現を使用して、目的のパターンに必要なデータをキャプチャします。

send -- "command to generate CSR"
send -- "\r"
expect -re "(-+BEGIN CERTIFICATE REQUEST-+.+-+END CERTIFICATE REQUEST-+)"

次に、キャプチャされたテキストをファイルに書き込み、キャリッジリターンを削除します。

set csr_text [regsub -all {\r\n} $expect_out(1,string) {\n}]
set fh [open $csr w]
puts $fh $csr_text
close $fh

答え2

答えがあることを願っていますexpectが、そうでない場合は、後処理にawkを使用できます。

$ awk '
    BEGIN {
        beg = "-----BEGIN CERTIFICATE REQUEST-----"
        end = "-----END CERTIFICATE REQUEST-----"
    }
    { sub(/\r$/,"") }
    sub(".*"beg,beg),sub(end".*",end)
' file
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----

私は常にフラグをサポートするために範囲式を使用しないことをお勧めします(参照:https://stackoverflow.com/q/23934486/1745001)しかし、他の用途には絶対に使用しないので、何が違うのかを見つけました。

関連情報