2016-08-01 29 views
1

來自其他用戶的這個問題被錯誤地標記爲重複,所以我再次發佈它,強調問題。在sed表達式中從貓逃脫新行

我試圖在我的一個xml文件中設置一個私鑰,保存在外部存儲庫中,出於安全原因。 這是我的bash腳本

sed -i -e "s/privateKey/`cat privatekey`/g" text.txt 

凡專用密鑰是我的鑰匙從倉庫和下載的text.txt包含

<test> 
    privateKey 
    </test> 

運行該腳本後,我期待這樣的:

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

但由於包含的私鑰sed讓我這個錯誤

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

任何想法如何逃脫從cat命令進來的新行字符?

+0

您是否考慮過使用「sed」以外的工具? –

+1

...順便說一句,如果你認爲應該重新打開一個問題,你可以編輯它 - 這將把它放在隊列中考慮重新打開。這樣我們就不會在同一件事情上混淆不同的知識庫,原來的人會在有答案(和他們的問題的信用/回購)時得到通知,&c。 –

回答

1

的解決方案是簡單地更換每一個新行字符\\ñ事先:

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

只是把這個命令加入到最終的sed命令:

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

的唯一剩下的就是正確縮進文件:

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

注意:顯然這不適用於OSX,但它可以與Linux一起使用。

+0

它給我完全一樣的錯誤:(我會檢查是否我錯過了其他的東西 – paul

+0

你在使用GNU sed嗎?我只是試過這個,它對我來說是完美的工作 –

+0

我正在使用osx,但使用-e應該工作,但沒有我仍然有同樣的錯誤使用sed -i -e「s/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> 

在Linux中:

$ 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,是你使用Linux? – paul

+0

'sed -i -e'是爲GNU sed編寫的答案的肯定標誌(MacOS中給出的BSD sed不允許沒有參數給出用於備份文件的後綴的'-i')。 –

+0

是'sed'用於Linux,'echo + variables'用於OSX - 查看更新後的答案 –

0

最好的答案是不要使用sed。爲目的gawk(GNU AWK)函數BashFAQ #21給出:

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; 
    } 
    ' 
} 

...可以用作:

gsub_literal privateKey "$(<privatekey)" 

注意需要GNU AWK - BSD的AWK運與MacOS將失敗awk: newline in string