如何在sed命令中使用变量?

我尝试使用以下代码用ZZ替换QQ ,但它没有做我想要的:

 var1=QQ sed -i 's/$var1/ZZ/g' $file 

但是,这段代码符合我的要求:

 sed -i 's/QQ/ZZ/g' $file 

我如何在sed使用变量?

shell负责扩展变量。 当你对字符串使用单引号时,它的内容将按字面意思处理,因此sed现在尝试用ZZ替换文字$var1的每个匹配项。

使用双引号

使用双引号使shell扩展变量,同时保留空格:

 sed -i "s/$var1/ZZ/g" "$file" 

当您在替换字符串中需要引号字符时,必须在其前面加上一个反斜杠,该反斜杠将由shell解释。 在下面的示例中,字符串quote me将替换为"quote me" (字符&sed解释):

 sed -i "s/quote me/\"&\"/" "$file" 

使用单引号

如果您有很多shell元字符,请考虑对模式使用单引号,并为变量使用双引号:

 sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file" 

注意我s,pattern,replacement,如何使用s,pattern,replacement,而不是s/pattern/replacement/ ,我这样做是为了避免干扰/ in \0/

然后shell使用下一个参数运行上面的命令sed (假设pattern=bertfile=text.txt ):

 -i s,bert,Say hurrah to &: \0/, text.txt 

如果file.txt包含bert ,则输出将为:

 Say hurrah to bert: \0/ 

我们可以使用双引号在sed使用变量:

 sed -i "s/$var/r_str/g" file_name 

如果变量中有斜杠/ ,则使用不同的分隔符,如下所示:

 sed -i "s|$var|r_str|g" file_name