2013-10-15 30 views
0

問題1插入:查找模式並更換整條生產線和尋找模式和後

模式:

test_$(whoami) 

變量:

var1=$(pwd) 

我想找到的模式,用var1代替整行

sed -i "s/.*test_$(whoami).*/$var1/" test.txt 

它給我的sed:-e表達式#1,焦炭28:未知的選項爲'S'

問題2.

模式:

#####Insert here##### 

內容是插入:包括$ VAR1 /file_$(whoami).txt

我想找到與模式(完全匹配)就行了,之後插入內容一行

sed -i "s/#####Insert here#####/include $var1/file_$(whoami).txt" test.txt 

也不管用

有人可以幫忙嗎?

回答

0

重新提問。使用不同的正則表達式的分隔符:

sed -i.bak "s~^.*test_$(whoami).*$~$var1~" test.txt 

因爲$var1可以包含/

0

問題1. 看來$ VAR1包含解釋爲字符sed的分隔符,即: '/'。

替代命令,第三分隔符之後,sed的預計的發生數,你可以提供文本。

例如,如果:

var1="~/myDirectory" 

那麼這將產生一個sed中有太多的分隔符命令:

sed -i 's/.*test_$(whoami).*/~/myDirectory/" 

你應該使用不同的分隔符,如〜,#, ?,&,| ......不存在於您的正則表達式中的一個。 桑達將自動識別分隔符的替代命令後,使您可以使用「/」字符你的正則表達式:如果你有困難找到一個字符不存在

sed "s#~/toto#~/tata#" 

在你的正則表達式中,你可以使用不可能在你的模式中存在的不可打印字符。例如,如果你的shell是慶典

$ echo '/~#' | sed s$'\001''/~#'$'\001''!?\&'$'\001''g' 

在這個例子中,慶典取代$'\001'與具有八進制值001的字符 - 在ASCII它的SOH字符(標題的開始)。

由於這些字符是控制/不可打印的字符,所以它們存在於模式中是值得懷疑的。除非你正在做一些奇怪的事情,比如修改二進制文件 - 或者沒有正確的區域設置的Unicode文件。

問題2. 你可能會尋找sed的的附加功能(「A」):

sed -i "/#####Insert here#####/ a include $var1/file_$(whoami).txt" test.txt