0

Question 1:

Pattern:

test_$(whoami)

Variable:

var1=$(pwd)

I want to find the pattern and replace the whole line with var1

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

It gives me sed: -e expression #1, char 28: unknown option to `s'

Question 2.

Pattern:

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

Content to be insert: include $var1/file_$(whoami).txt

I want to find the line with the pattern(Fully match), and insert the content one line after

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

Doesn't work either

Can someone help?

4

2 回答 2

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
于 2013-10-17T09:00:29.963 回答
0

关于问题1。使用不同的正则表达式分隔符:

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

因为$var1可以包含/

于 2013-10-15T17:34:16.923 回答