変数が任意の(証明書)テキストである場合の変数でsedを使用する方法

変数が任意の(証明書)テキストである場合の変数でsedを使用する方法

事前に取得したいくつかの変数からテキストファイルをインストールするbashシェルスクリプトを作成しようとしています。

これを行うには、sedを使用して必要に応じてファイルのフラグを変更します。

sed "s/this is a line in text/$var/g" file

うまく動作し、問題はありません。しかし、$var変数には通常、暗号鍵などの奇妙な文字があります。例:

-----BEGIN CERTIFICATE-----
MIID0DCCArigAwIBAgIJAMZxe+Z+DbdtMA0GCSqGSIb3DQEBCwUAME4xCzAJBgNV
BAYTAi0tMQswCQYDVQQIEwItLTELMAkGA1UEBxMCLS0xCzAJBgNVBAoTAi0tMRgw
FgYJKoZIhvcNAQkBFgltZUBteS5vcmcwHhcNMjEwODI1MDgyODMzWhcNMzEwODIz
MDgyODMzWjBOMQswCQYDVQQGEwItLTELMAkGA1UECBMCLS0xCzAJBgNVBAcTAi0t
MQswCQYDVQQKEwItLTEYMBYGCSqGSIb3DQEJARYJbWVAbXkub3JnMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1VtgDdOnhyGGd3OQO+QHcqfiH1wP1wJC
5MPZFm9FOQKC74FscbeLflu+hXVSLQQjP8XgJrbCk+xNe+SFOLMoIG mpxvRsjZU
eLzA5lUR8PvmBvgt1iR s1AQQAyh6R7z5QdwamsjmyoE1Si6maRzeCiv46qmlyet
iUEqbXslMk8N6Pa3KsKskv7BgzSOlfLHuWaZScewViGBSbyKUUYV0ljWbGozs21i
w FftSM6JnyNIq6l0wvGYkpJoDpGyxeNPTykswSO6WsG5o8ogJYOQR3KduUqdalj
tHbBsnGB1PNqfhpkBn75FY 8aNryND+uYkkQu1fGVJG0j2XVcPSPpBywZSwGtcCO
LPTL9OIYlRzzVi vTS CRx4NqSY=
-----END CERTIFICATE-----

これが発生すると、sedコマンドが中断され、次のような結果が発生します。

sed: -e expression #1, char 39: unterminated `s' command

変数の内容がコマンドsedの一部として解釈され、sedエラーが発生することを理解しています。

sed変数をプレーンテキストで送信して解釈しないようにする方法はありますか?可能でない場合、sedこの場合に実行できる簡単な代替方法はありますか?


証明書の内容に特殊文字が含まれていることを証明するには、証明書を更新してください/

cat ca.crt | grep "\/"

grep: warning: stray \ before /
5MPZFm9FOQKC74FscbeLflu+hXVSLQQjP8XgJrbCk+xNe+SFOLMoIG/mpxvRsjZU
eLzA5lUR8PvmBvgt1iR/s1AQQAyh6R7z5QdwamsjmyoE1Si6maRzeCiv46qmlyet
gUX/9Bunyu65hQ+h5kV4aWMRgnDH8HoTQsrJQd4eshHwsqgQA3+Oou4m6GLihkfC
QwsENypmlOiOeYvmxBC0X/w/2IeZMEDbmrMO0yUL6No9xQan7wKNFwIDAQABo4Gw
ggEBAJBDpHQBNlFoMjeQrH1szNe+30rp3ECCwXH4L+qKegobZ5/+joWSk84pRF0J
w/FftSM6JnyNIq6l0wvGYkpJoDpGyxeNPTykswSO6WsG5o8ogJYOQR3KduUqdalj
tHbBsnGB1PNqfhpkBn75FY/8aNryND+uYkkQu1fGVJG0j2XVcPSPpBywZSwGtcCO
LPTL9OIYlRzzVi/vTS/CRx4NqSY=

答え1

(変数値の代わりに)挿入されたファイルの内容を使用する方が簡単ですsed

sed -e '/^this is a line in text$/r mycert' -e '//d' file

これはというファイルを解析しますfile^this is a line in text$式に一致する行が見つかると、mycert呼び出されたファイルは何らかの解釈なしで挿入されます。fileその後、元の行を削除します。

次の変数から読み取ることができます。

printf '%s\n' "$var" |
sed -e '/^this is a line in text$/r /dev/stdin' -e '//d' file

mycertここでは、行が見つかったときから読み取るのではなく、それを介してsed提供された標準入力から読み込みますprintf。これは、トリガラインが1回だけ表示されると仮定しますfile

答え2

「これはテキストの1行です」が1つの単語で構成されていると仮定すると、マクロプロセッサを使用できます。

m4 -Dword="$var" file

ここで、「word」-name は一連の文字、数字、下線で、最初の文字は数字ではありません。

答え3

証明書の場合、問題となる文字はスラッシュと改行文字の2つだけです。パラメータ拡張を使用して、それぞれをsedが理解する合計に置き換えることができます\/\n

var=${var//$'\n'/\\n/}
var=${var//\//\\\/}
sed "s/text/$var/"

しかし、通常、私はどの文字が変数から来たのか、どの文字が構文の一部であるかを知るPerlを使用します。

var=$var perl -pe 's/text/$ENV{var}/'

関連情報