2016-08-01 2 views
1

다른 사용자의이 질문에 부적절하게 중복 된 것으로 표시되었으므로 다시 게시하여 문제를 강조합니다.sed 표현식에서 cat의 새 줄을 이스케이프 처리합니다.

내 xml 파일 중 하나에 보안상의 이유로 외부 저장소에 저장하는 개인 키를 설정하려고합니다.

<test> 
     -----BEGIN RSA PRIVATE KEY----- 
     privatekeyblablablablafoooo 
     -----END----------- 
</test> 

: 이 내 bash는 스크립트입니다

의 PrivateKey가 저장소와 text.txt에서 내 키를 다운로드
sed -i -e "s/privateKey/`cat privatekey`/g" text.txt 

내가이 기대 된 스크립트를 실행 한 후

<test> 
    privateKey 
    </test> 

을 포함 하지만 sed가 포함 된 개인 키 때문에이 오류가 발생합니다.

sed: 1: "s/privateKey/-----BEGIN ...": unescaped newline inside substitute pattern 

cat 명령에서 오는 새로운 행 문자를 어떻게 피할 수 있습니까?

+0

''sed' 이외의 툴을 사용해 보셨습니까? –

+1

...btw, 질문을 다시 열어야한다고 생각하면 그냥 편집 할 수 있습니다. 다시 열기를 위해 대기열에 넣을 것입니다. 그런 식으로 우리는 지식베이스가 똑같은 것에 대해 다른 변종으로 어수선해지지 않게합니다. 원래 사람은 대답이있을 때 (그리고 그들의 질문에 대해 신용/레포), & c. –

답변

1

이 솔루션은 단순히 함께 모든 새로운 라인 문자를 대체하는 것입니다 \\ n은 사전에 :

sed -i -e "s/privateKey/$(cat privatekey | sed ':a;N;$!ba;s/\n/\\n/g')/g" text.txt 

유일한 것은 왼쪽은 다음과 같습니다

cat privatekey | sed ':a;N;$!ba;s/\n/\\n/g' 

그냥 최종 나오지 명령에이 명령을 넣어 파일을 들여 쓰기 적절하게 들여 쓰기 :

sed -i '3,4s/^/\t/' text.txt 

참고 : 분명히 이것은 OSX에서는 작동하지 않지만 Linux에서는 작동합니다.

+0

나에게 정확히 같은 오류를 주었다. (내가 뭔가를 놓친다면 확인해 보겠다.) – paul

+0

GNU sed를 사용하고 있습니까? 다시 시도해 보았습니다. 완벽하게 작동하고 있습니다. –

+0

osx를 사용하고 있지만 -e를 사용하고 있습니다. 하지만 sed -i -e "/ privateKey/$ (cat privatekey | sed ': a; N; $! ba; s/\ n/\\ n/g')를 사용하면 여전히 같은 오류가 발생하지 않습니다./g "text.txt 마침내 sed -i -e '2r privatekey.txt'text.txt를 사용하여 해결되었지만 원하는 줄을 모두 제공해야합니다. – paul

2

비슷한 문제가 unix.stackexchange에 답하고있다 - Substitute pattern within a file with the content of other file :

sed -i -e '/privateKey/ {' -e 'r privatekey' -e 'd' -e '}' text.txt 
+0

sed : 1 : "/privateKey/{ ": 예기치 않은 EO F (보류 중)) – paul

+0

두 번째 옵션은 내가 링크 된 해당 스레드에서 설명 할 수 있습니까? GNU sed와 OSX의 차이점을 모른다. – Sundeep

1

replace-string-with-contents-of-a-file-using-sed

OSX에서 리눅스에서

$ cat t.txt 
<test> 
privateKey 
</test> 

$ cat key.file 
-----BEGIN RSA PRIVATE KEY----- 
privatekeyblablablablafoooo 
-----END----------- 

$ f1=$(<key.file) 
$ f2=$(<t.txt) 

$ echo "${f2//privateKey/$f1}"|tee t.txt 
<test> 
-----BEGIN RSA PRIVATE KEY----- 
privatekeyblablablablafoooo 
-----END----------- 
</test> 

:

$ sed -e '/privateKey/{r key.file' -e 'd}' t.txt 
<test> 
-----BEGIN RSA PRIVATE KEY----- 
privatekeyblablablablafoooo 
-----END----------- 
</test> 

$ sed -i -e '/privateKey/{r key.file' -e 'd}' t.txt 
$ cat t.txt 
<test> 
-----BEGIN RSA PRIVATE KEY----- 
privatekeyblablablablafoooo 
-----END----------- 
</test> 
+0

sed를 반환한다. 1 : "/ privateKey/{r privatek ...": 예기치 않은 EOF (pending)의 것) OSX를 사용하고있다. 당신은 리눅스를 사용하고 있습니까? – paul

+0

'sed -i -e'는 GNU sed 용으로 작성된 답변의 확실한 표시입니다 (MacOS에서 주어진 BSD sed는 백업 파일에 접미어를 사용하는 인수가없는'-i'를 허용하지 않습니다). –

+0

yes'sed'는 리눅스 용이고'echo + variables'는 OSX 용입니다 - 업데이트 된 답변보기 –

0

가장 좋은 대답은 sed을 사용하지 않는 것입니다. 목적을위한 gawk (GNU AWK) 함수는 BashFAQ #21에 제시되어있다 :

gsub_literal privateKey "$(<privatekey)" 

참고 GNU의 AWK의 필요성 - 제공된 BSD의 AWK :로 사용할 수 있습니다

gsub_literal() { 
    # STR cannot be empty 
    [[ $1 ]] || return 

    # string manip needed to escape '\'s, so awk doesn't expand '\n' and such 
    gawk -v str="${1//\\/\\\\}" -v rep="${2//\\/\\\\}" ' 
    # get the length of the search string 
    BEGIN { 
     len = length(str); 
    } 

    { 
     # empty the output string 
     out = ""; 

     # continue looping while the search string is in the line 
     while (i = index($0, str)) { 
     # append everything up to the search string, and the replacement string 
     out = out substr($0, 1, i-1) rep; 

     # remove everything up to and including the first instance of the 
     # search string from the line 
     $0 = substr($0, i + len); 
     } 

     # append whatever is left 
     out = out $0; 

     print out; 
    } 
    ' 
} 

... MacOS의 경우 awk: newline in string으로 실패합니다.

관련 문제