2013-10-15 32 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