事前に取得したいくつかの変数からテキストファイルをインストールする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
。