변수가 임의의(인증서) 텍스트인 경우 변수와 함께 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. 이는 트리거 라인이 에서 한 번만 나타난다고 가정합니다 file.

답변2

"이것은 텍스트의 한 줄입니다"가 한 단어로 구성되어 있다고 가정하면 매크로 프로세서를 사용할 수 있습니다.

m4 -Dword="$var" file

여기서 "word"-name은 일련의 문자, 숫자 및 밑줄이며 첫 번째 문자는 숫자가 아닙니다.

답변3

인증서의 경우 문제가 되는 문자는 슬래시와 개행 문자 두 개뿐입니다. 매개변수 확장을 사용하여 각각을 sed가 이해하는 합계로 바꿀 수 있습니다 \/.\n

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

그러나 일반적으로 나는 어떤 문자가 변수에서 왔는지, 어떤 문자가 구문의 일부인지 아는 Perl을 사용합니다.

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

관련 정보