2014-03-06 18 views
2

我有以下sed命令:不要把在sed變量的內容爲特殊字符

sed -i "4i\ $CHANGES" ./CHANGELOG.rst 

但是,我$CHANGES變量看起來是這樣的:

title 
----- 

* list 
    * elem 
    * elem 

因此,上面的命令失敗並出現以下錯誤:sed: -e expression #1, char 149: unknown command: '*'。我知道發生這種情況的原因是$CHANGES變量的內容有些被解釋了,但我該如何指定僅將變量中的字符串用作原始字符串,而不解釋其內容?

+0

哪裏是哪裏來的'$ CHANGES'的內容?如果它是一個文件,我們可以用'sed ... r'來處理。 – fedorqui

+0

不,它是在我需要將其內容添加到指定文件之前構建在同一個腳本中的變量。 – linkyndy

回答

2

嘗試

sed -i "4 i\ 
${CHANGES//$'\n'/\\$'\n'}" ./CHANGELOG.rst 

由於@NeronLeVelu筆記,

  • 你需要換行後i\
  • 換行文中傳遞給sedi函數必須是\ -escaped - 這是bash參數(變量)替換的含義。
+0

做得很好的內聯改編+1 – NeronLeVelu

+0

它終於奏效了,非常感謝! – linkyndy

+0

@AndreiHorak我的榮幸;聽到那個消息很開心。 – mklement0

2

另一個好老「用AWK而不是」風格的答案...

如果你只是想插入第4行該字符串,你可以在AWK這樣做是這樣的:

awk -v var="$CHANGES" 'NR == 4 { print var } { print }' ./CHANGELOG.rst > tmp && mv tmp ./CHANGELOG.rst 

這會在文件中的第4行之前插入變量$CHANGES的內容。的gawk

作爲評價和elsewhere提到,新版本(> = 4.1.0)可以做就地編輯:

gawk -i inplace -v var="$CHANGES" 'NR == 4 { print var } { print }' ./CHANGELOG.rst 

保存你幾個字符。

+0

如果不使用臨時文件,不能做到這一點嗎? – linkyndy

+0

據我所知,AWK不支持就地編輯。有趣的是,你應該提到它,但這個問題的典型答案是「改用sed」! http://stackoverflow.com/questions/910121/in-place-editing-using-awk –

+0

它確實......但只是在新版本中:http://stackoverflow.com/questions/16529716/awk-save-modifications即使 – fedorqui

2
sed "4 i\ 
$CHANGES" ./CHANGELOG.rst 
  • 需要一個新的生產線後,i\
  • 在一些sed中的i
  • $改變之前的空間必須有全新的符合\

逃脫這樣的awk更好在這種情況下。另一種方法是使用SED與臨時文件(i插入之前和r附加文件,因此1號線之前)

echo "${CHANGES}" > TempoFile 
sed "3 r TempoFile" YourFile 
rm TempoFile 
+0

+1爲背景信息。 – mklement0

1

好老版:

$ CHANGES="title 
----- 

* list 
    * elem 
    * elem" 

$ seq 10 > file 

$ ed file <<END 
4i 
$CHANGES 
. 
w 
q 
END 
21 
59 

$ cat file 
1 
2 
3 
title 
----- 

* list 
    * elem 
    * elem 
4 
5 
6 
7 
8 
9 
10