找到一个模式并替换整条线和&找到一个模式并插入后

时间:2013-10-15 17:31:29

标签: regex linux bash replace sed

问题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

不起作用

有人可以帮忙吗?

2 个答案:

答案 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