我尝试使用以下代码将QQ替换为ZZ,但它不能满足我的需求:

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


但是,此代码可以满足我的需求:

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


如何在sed中使用变量?

评论

在您的这篇文章中看到我的答案

相关:stackoverflow.com/questions/407523/…

#1 楼

外壳负责扩展变量。当对字符串使用单引号时,其内容将按字面意义处理,因此sed现在尝试将所有出现的$var1替换为ZZ

使用双引号

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

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


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

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


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

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: q4312078q/
/, text.txt
/,' "$file"


注意我如何使用s,pattern,replacement,代替的s/pattern/replacement/,我这样做是为了避免干扰/中的sed/

示例

然后,外壳程序将上述命令pattern=bert与下一个参数一起运行(假设file=text.txtfile.txt) :

q4312078q

如果bert包含q4312079q,则输出为:

q4312078q

评论


如何使用这种以逗号分隔的形式传递“ / g”选项?

–blong
2014年4月1日13:55

@ b.long这是一个g选项,因此您将改为传递s,foo,bar,g。

– Lekensteyn
2014年4月1日下午14:32

您的单引号示例特别有用,使用regex模式覆盖sed非常好!

–布赖恩·托马斯(Brian Thomas)
16-9-09 at 1:08



或者,对于超级偏执狂(如我自己),请sed's /'“ $ {foo}”'/ replacement /'

–leetbacoon
19-10-4的3:01

@leetbacoon您的妄想症为我节省了很多工作。由于特定于任务的原因,我无法使用上述模式。

–mnis
20年12月1日,7:33

#2 楼

我们可以在sed中使用双引号来使用变量: />
sed -i "s/$var/r_str/g" file_name


评论


如果您在变量中使用斜线/ =>这样就救了我!我的变量是一个url,它包含/。切换使用|作为分隔符解决了我的问题

–sonlexqt
18-09-20在4:39



竖起大拇指表示“如果变量中有斜杠”

–蒂娜(Tiina)
19年4月25日在2:07

@sonlexqt,相关:stackoverflow.com/questions/9366816/…

–加百利·斯台普斯
20 Mar 19 '20 at 6:33

#3 楼

要扩展(@puni)@mani的答案,

此解决方案适用于馈给其他命令的正则表达式,例如perl

在正则表达式周围使用双引号(是,甚至在Unixy系统下)也可以按预期顺序扩展变量

|也可能出现在变量的值中,因此不要害怕尝试其他定界符