Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 找到一个模式并替换整个系列&;找到一个图案,然后插入_Regex_Linux_Bash_Replace_Sed - Fatal编程技术网

Regex 找到一个模式并替换整个系列&;找到一个图案,然后插入

Regex 找到一个模式并替换整个系列&;找到一个图案,然后插入,regex,linux,bash,replace,sed,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#

问题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
也不行


有人能帮忙吗?

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

sed -i.bak "s~^.*test_$(whoami).*$~$var1~" test.txt
因为
$var1
可以包含问题1。 $var1似乎包含一个解释为sed分隔符的字符,即:“/”

在替换命令中,在第三个分隔符之后,sed需要出现一个编号,您可能正在提供文本

例如,如果:

var1="~/myDirectory" 
然后,这将生成一个带有太多分隔符的sed命令:

sed -i 's/.*test_$(whoami).*/~/myDirectory/"
您应该使用不同的分隔符,例如~、#、!、?、&、|。。。您的regexp中不存在的一个。 Sed将自动识别替换命令后的分隔符,并允许您在regexp中使用“/”字符:

sed "s#~/toto#~/tata#"
如果很难找到regexp中不存在的字符,可以使用模式中不太可能存在的不可打印字符。例如,如果shell是bash:

$ echo '/~#' | sed s$'\001''/~#'$'\001''!?\&'$'\001''g'
在本例中,bash
$'\001'
替换为八进制值为001的字符-在ASCII中是SOH字符(标题的开头)

由于这些字符是控制/不可打印字符,因此它们是否会存在于模式中是值得怀疑的。除非,也就是说,您正在做一些奇怪的事情,比如在没有正确的区域设置的情况下修改二进制文件或Unicode文件

问题2。 您可能正在查找sed的append函数('a'):

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