Нужна помощь с использованием sed, чтобы прекратить интерпретировать \ n как новую строку в сценариях Linux Bash - PullRequest
0 голосов
/ 31 декабря 2018

Я новичок в Linux и любых скриптах bash, и у меня возникла следующая проблема:

У меня есть этот kryptokey:

-----BEGIN CERTIFICATE-----\n
MIICSTCCAfCgAwIBAgIRAMsLZqD4PavC7NJz7+5ld+EwCgYIKoZIzj0EAwIwdjEL\n
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\n
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\n
c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgxMjMxMTA1ODA5WhcNMjgxMjI4MTA1\n
ODA5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\n
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G\n
A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\n
AwEHA0IABEbH7l3CiqLA4N4wgfilYgyEuxDrMAqDX6BrFOfWhymNosjh5FlJDHtN\n
GPDKhjtrI6e1q0NC0l6wh9h9TrBn7N2jXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV\n
HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIH7OaekSLJda\n
S0yuV9PCsuasGTt/+/35aVBXTVbII2rCMAoGCCqGSM49BAMCA0cAMEQCIEd+YP/6\n
tCzG/LueYTEio8ApQSyz94ju07pmc3LZJDKBAiALu66LKhOpKhogY9XEFg4TScOt\n
el4dC6OnMMTmRsEtoA==\n-----END CERTIFICATE-----\n

сохранен в файле $replacementOrg1 (это путь кэтот файл).Теперь я хочу заменить в шаблоне $file "INSERT_ORG1_CA_CERT" этот сертификат и сохранить его в $org1.Но мне нужно сохранить символ "\ n".Результат должен оставить \ n и записать его в одну строку.

Я уже пробовал:

sed -e "s@INSERT_ORG1_CA_CERT@$(cat $replacementOrg1)@g" $file > $org1

, но он интерпретирует "\ n" как новую строку.

Таким образом, конечный результат должен выглядеть следующим образом, 1 строка в 1Линия:

    "-----BEGIN   CERTIFICATE-----\nMIICSTCCAfCgAwIBAgIRAMsLZqD4PavC7NJz7+5ld+EwCgYIKoZIzj0EAwIw       djEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\nc2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgxMjMxMTA1ODA5WhcNMjgxMjI4MTA1\nODA5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G\nA1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEbH7l3CiqLA4N4wgfilYgyEuxDrMAqDX6BrFOfWhymNosjh5FlJDHtN\nGPDKhjtrI6e1q0NC0l6wh9h9TrBn7N2jXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV\nHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIH7OaekSLJda\nS0yuV9PCsuasGTt/+/35aVBXTVbII2rCMAoGCCqGSM49BAMCA0cAMEQCIEd+YP/6\ntCzG/LueYTEio8ApQSyz94ju07pmc3LZJDKBAiALu66LKhOpKhogY9XEFg4TScOt\n
el4dC6OnMMTmRsEtoA==\n-----END CERTIFICATE-----\n"

Кто-нибудь может помочь?Спасибо

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Команда s ubstitute не очень хороша для многострочных замещающих строк.Но мы можем использовать команду GNU sed r ead , чтобы обойти это:

 echo "${replacementOrg1}" | 
 sed -e '/INSERT_ORG1_CA_CERT/{r /dev/stdin'  -e ';d}' ${file} > ${org1}

Как это работает:

  1. echo многострочная строка, передающая ее в /dev/stdin.
  2. Когда sed находит цель "INSERT_ORG1_CA_CERT", она r уходит /dev/stdin и выводит содержимое
  3. , затем d eletes строка строки поиска (которая, как предполагается, не содержит никакого другого текста).

Хитрая часть - недостаточно документированная rкоманда - sed предполагает все после r является частью имени файла.Если бы мы попытались '/INSERT_ORG1_CA_CERT/{r /dev/stdin;d}', то получилось бы сообщение об ошибке:

unmatched '{'

Поскольку sed считал бы, что имя файла буквально "/ dev / stdin; d}".Но сообщение об ошибке не жалуется на отсутствующий файл, потому что sed никогда не жалуется на отсутствующее r имя файла.Вместо этого sed жалуется на отсутствие закрывающей скобки }, поскольку sed считает, что } является частью имени файла.

Чтобы избежать этой ошибки, мы вставляем туда ' -e '.

0 голосов
/ 31 декабря 2018

Это неверный ключ.Кто-то сделал «полукодирование» (я не знаю лучшего термина) новых строк - они добавляли буквальную строку «\ n» перед каждым новым переводом.Скорее всего, вам понадобится либо исходный ключ без строк "\ n" или строка из одной строки, где каждая новая строка была заменена на "\ n".

С исходным значением вместо него можно использовать replace - он поддерживает новые строки в значении замены:

$ replace foo $'foo\nbar' <<< $'x\nfoo\ny'
x
foo
bar
y

Ваш случай должен быть просто replace 'INSERT_ORG1_CA_CERT' "$(< $replacementOrg1)" "$file" > "$org1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...