2012-09-03 137 views
6

我試圖插入sed(剛剛讀過它),我被試圖插入多行被難住?Sed插入多行

什麼我目前做的是:

sed -i "${line} i\ 
     /* Name - ID */ \ 
     select @ID = NULL \ 
     from Animals \ 
     where VrsnID = @VrsnID \ 
     and  Request= \"Request\" \ 
\ 
" animalNames.txt 

echo $line == 131

新問題

一切都在一行在輸出中出現? (也缺失頭縮進)

/* Name - ID */  select @ID = NULL   from Animals   where VrsnID = @VrsnID   and  Request= "Request" 

解決

但這拋出:

sed: -e expression #1, char 47: unknown command: ` 
' 

任何想法,爲什麼?

感謝您的時間

+0

SED哪個版本您使用? GNU/BSD? – Zulu

+0

GNU對不起,沒有意識到做了一個dif –

+0

在這裏工作,GNU sed版本4.2.1 – Thor

回答

4

對於新的麻煩: 使用雙反斜線\\

+0

驚人的謝謝,爲什麼我不能在谷歌的任何地方找到這個(必須做了20多個搜索「sed多行插入」) –

+1

因爲對於多行,最好使用AWK。 (在我看來) – Zulu

+0

在附註中,是否可以讀取插入「contents」而不是C&P的文件到sed命令中? –

11

在一個shell腳本,反斜槓+換行變成了空。這是一種在字符串中沒有換行的情況下繼續下一行的方法。所以sed看到的只是一條大線。比較:

$ echo "foo\ 
> bar" 
foobar 
$ echo "foo 
> bar" 
foo 
bar 

你需要通過把一個反斜槓之前通過一個反斜槓和一個新來的sed,所以轉義反斜線。

sed -i "${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= \"Request\" \\ 

" animalNames.txt 

如果你通過標準輸入爲here document腳本這可能是更具可讀性。您需要將擴展​​替換爲${line},因此您仍需要加倍反斜槓。

sed -i -f - animalNames.txt <<EOF 
${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= "Request" \\ 

EOF 
+0

感謝所有進一步的信息吉爾! –

+0

對於heredoc版本+1。正在努力獲得一個內聯命令處理多行包含各種重要的元字符和引號。這種方法第一次完美運行,並且更清潔,未來我也會成爲我的代名詞。 – randomsock

1

這可能會爲你工作:

sed ${line}'i\ 
    /* Name - ID */ \ 
    select @ID = NULL \ 
    from Animals \ 
    where VrsnID = @VrsnID \ 
    and  Request= \"Request\" 

' animalNames.txt 
+0

你需要使用\\換行 –

+0

@PezCuckow(使用GNU sed和bash)一個\就足夠了。 – potong