问题1:
模式:
test_$(whoami)
变量:
var1=$(pwd)
我想找到模式并用var1
sed -i "s/.*test_$(whoami).*/$var1/" test.txt
它给了我sed:-e表达式#1,char 28:'s'的未知选项
问题2。
模式:
#####Insert here#####
要插入的内容:包括$ var1 / file _ $(whoami).txt
我想找到带有模式的行(完全匹配),然后在
之后插入一行内容sed -i "s/#####Insert here#####/include $var1/file_$(whoami).txt" test.txt
不起作用
有人可以帮忙吗?
答案 0 :(得分:0)
重新提问 1 。使用不同的正则表达式分隔符:
sed -i.bak "s~^.*test_$(whoami).*$~$var1~" test.txt
因为$var1
可以包含/
答案 1 :(得分:0)
问题1。 似乎 $ var1 包含一个被解释为 sed 分隔符的字符,即:'/'。
在替换命令中,在第三个分隔符之后, sed 需要一个事件编号,并且您可能正在提供文本。
示例,如果:
var1="~/myDirectory"
然后生成带有太多分隔符的 sed 命令:
sed -i 's/.*test_$(whoami).*/~/myDirectory/"
您应该使用不同的分隔符,例如〜,#,!,?,&,| ...你的正则表达中没有的一个。 Sed 会在替换命令后自动识别分隔符,并允许您在正则表达式中使用'/'字符:
sed "s#~/toto#~/tata#"
如果您在查找正则表达式中不存在的字符时遇到困难,可以使用模式中不太可能存在的不可打印字符。例如,如果您的shell是 bash :
$ echo '/~#' | sed s$'\001''/~#'$'\001''!?\&'$'\001''g'
在此示例中, bash 将$'\001'
替换为具有八进制值001的字符 - 在ASCII中,它是SOH字符(标题的开头)。
由于这些字符是控制/不可打印的字符,因此它们将存在于模式中是值得怀疑的。除非,即你正在做一些奇怪的事情,如修改二进制文件 - 或没有正确的语言环境设置的Unicode文件。
问题2。 您可能正在寻找 sed 的附加功能('a'):
sed -i "/#####Insert here#####/ a include $var1/file_$(whoami).txt" test.txt