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