CLRF를 공개 키의 새 줄로 바꾸는 방법

CLRF를 공개 키의 새 줄로 바꾸는 방법

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

정규식이 예상대로 작동하지 않습니다. 뒤에 Por 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사용하여 이를 리터럴 문자열로 쉽게 바꿀 수 있습니다.\ntr

$ 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는 그렇지 않습니다).\rsedsed

스크립트 sed는 먼저 현재 줄 끝에 있는 캐리지 리턴 문자를 백슬래시로 바꾸고 이를 예약된 공간에 추가합니다(첫 번째 줄은 개행 문자를 먼저 추가하지 않고 예약된 공간을 대체합니다). 마지막 줄에 도달하면 스왑은 공백을 유지하고 줄 바꿈을 문자로 바꾸고 n마지막 슬래시를 \n.

결과에는 끝에 개행 문자가 있습니다(명령 결과와 반대 tr).

관련 정보