QQ
替换为ZZ
,但它不能满足我的需求:var1=QQ
sed -i 's/$var1/ZZ/g' $file
但是,此代码可以满足我的需求:
sed -i 's/QQ/ZZ/g' $file
如何在
sed
中使用变量?#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.txt
和file.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系统下)也可以按预期顺序扩展变量
|
也可能出现在变量的值中,因此不要害怕尝试其他定界符
评论
在您的这篇文章中看到我的答案相关:stackoverflow.com/questions/407523/…