CLRF
단일 문자열이 되도록 공개 키를 바꿔야 합니다 .\n
입력하다:.
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvam/SXoPt4YccVuh1Pj/
GmVc/43Y58Weell9U8yIOzqHxWoDFwjRTAtZceVg7SY17ex5AsFDT+4pf46GXa7A
5Jd4u0VlCAC06GKkz0Dvfh4ETIfZXAwXhbvWUm1IgoERG46DAwIgseHe2bRhC56E
9KkVzbuivAan5vvOuKnZ9DkSKCCGpUo/UQfImbkFzNHGb9NPivvHf19pXio7vM7E
DmP1GYEhVUtRgUoUfNKqEKUoO3uueYMLUwL9ePjnNdg3chpneBihFPd0317FAc8n
0TibwVUR2iJrH5fEUNCczfnydQ2p5hKxvhYjswAe+PHktmlhbnmeBo16oUAuowxp
6wIDAQAB
-----END PUBLIC KEY-----
내가 시도한 것은 다음과 같습니다.
PUB_KEY=$(cat keyfile)
PUB_KEY=$(echo $PUB_KEY | sed 's/ [^PUBLIC KEY]/\\n/g')
산출:
-----BEGIN PUBLIC KEY-----\nIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvam/SXoPt4YccVuh1Pj/\nmVc/43Y58Weell9U8yIOzqHxWoDFwjRTAtZceVg7SY17ex5AsFDT+4pf46GXa7A\nJd4u0VlCAC06GKkz0Dvfh4ETIfZXAwXhbvWUm1IgoERG46DAwIgseHe2bRhC56E\nKkVzbuivAan5vvOuKnZ9DkSKCCGpUo/UQfImbkFzNHGb9NPivvHf19pXio7vM7E\nmP1GYEhVUtRgUoUfNKqEKUoO3uueYMLUwL9ePjnNdg3chpneBihFPd0317FAc8n\nTibwVUR2iJrH5fEUNCczfnydQ2p5hKxvhYjswAe+PHktmlhbnmeBo16oUAuowxp\nwIDAQAB\n----END PUBLIC KEY-----
그러나 첫 번째 문자 "M"이 삭제되고 공백 1개가 대체되지 않는 등 출력에 몇 가지 문제가 있습니다.
답변1
정규식이 예상대로 작동하지 않습니다. 뒤에 P
or U
또는 B
... 가 오지 않는 공백 문자와 일치합니다 . […]
여러 문자 중 하나만 일치하는 문자 클래스입니다 . M
문자 클래스에 없기 때문에 문자열에서 누락된 다른 문자처럼 제거됩니다.
GNU를 사용하면 sed
모든 줄바꿈을 리터럴로 변경하고 \n
줄 끝의 마지막 리터럴을 제거할 수 있습니다.\n
PUB_KEY=$(sed -z 's/\n/\\n/g;s/\\n$//' keyfile)
이제 문자열은 개행 문자로 끝나지 않지만, 그것이 바로 여러분이 원하는 것이라고 생각합니다.
답변2
더 나은 접근 방식은 줄 바꿈을 인쇄할 수 없는 문자로 변환한 다음 "\n"으로 바꾸는 것입니다.
SOH=$(echo -en "\001")
PUB_KEY=$(cat keyfile|tr -d '\r'|tr '\n' "$SOH"|sed "s/$SOH/\\\\n/g"|sed 's/\\n$//')
SOH = SOH 인쇄할 수 없는 ASCII 문자
이후에는 개행 문자가 인쇄할 수 없는 SOH 문자로 변환된 다음 이스케이프된 개행 문자 "\n"으로 다시 변경됩니다.
답변3
파일이 줄 끝이 있는 DOS 텍스트 파일인 경우 다음을 \r\n
사용하여 이를 리터럴 문자열로 쉽게 바꿀 수 있습니다.\n
tr
$ tr '\r\n' '\\n' <keyfile
-----BEGIN PUBLIC KEY-----\nMIIBIjANBg...etc...\n6wIDAQAB\n-----END PUBLIC KEY-----\n
(출력 끝에 개행 문자가 없습니다)
인수 조합은 tr
각 캐리지 리턴( \r
) 문자를 문자 \
(이스케이프해야 함)로 바꾸고 각 줄 바꿈( \n
) 문자를 문자로 바꿉니다 n
.
다른 사람들이 지적했듯이 귀하의 명령은
sed 's/ [^PUBLIC KEY]/\\n/g'
부분적으로 " 세트에 없는 단일 문자 (및 공백 문자) " 때문에 개행 문자 교체가 \n
작동하지 않습니다 .[^PUBLIC KEY]
BCEIKLPUY
이렇게 하려면 sed
다음과 같이 할 수 있습니다.
sed -n 's/\r$/\\/; 1{ h; d; }; H; ${ x; y/\n/n/; s/\\$/&n/; p; }' keyfile
이는 캐리지 리턴을 사용하고 sed
있다고 가정합니다(GNU는 이를 수행하지만 OpenBSD는 그렇지 않습니다).\r
sed
sed
스크립트 sed
는 먼저 현재 줄 끝에 있는 캐리지 리턴 문자를 백슬래시로 바꾸고 이를 예약된 공간에 추가합니다(첫 번째 줄은 개행 문자를 먼저 추가하지 않고 예약된 공간을 대체합니다). 마지막 줄에 도달하면 스왑은 공백을 유지하고 줄 바꿈을 문자로 바꾸고 n
마지막 슬래시를 \n
.
결과에는 끝에 개행 문자가 있습니다(명령 결과와 반대 tr
).