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


Answers:


358

外壳负责扩展变量。当您使用单引号表示字符串,将其内容逐字处理,所以sed现在尝试取代文字的每次出现$var1ZZ

使用双引号

使用双引号使外壳扩展变量,同时保留空白:

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 &: \0/,' "$file"

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

然后,shell sed使用以下参数(假设pattern=bertfile=text.txt)运行上述命令:

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

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

Say hurrah to bert: \0/

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

6
@ b.long这是一个g选项,因此您可以通过s,foo,bar,g
Lekensteyn

1
您的单引号示例特别有用,使用regex模式覆盖sed非常好!
布莱恩·托马斯

万一您想使用\\0而不是\0,当\0用单引号引起来时不应该这样做。否则,sed将模式替换为文字\0而不是整个匹配项。
Lekensteyn

为我做了把戏。
jimh

114

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

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

如果/变量中有斜杠,请使用其他分隔符,如下所示:

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

7
如果/变量中有斜线=>这样就救了我!我的变量是url,其中包含/。切换|为分隔符解决了我的问题
sonlexqt

竖起大拇指“如果您在变量中有一个斜杠”
Tiina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.