问题:
我试图在一个 Bash 脚本中使用 sed 改变文本文件中的值:
bash
sed 's/draw($old_num;n_)/draw($new_num;n_)/g' file.txt > tmp
这行代码将在 for 循环中。为什么它不起作用?
回答:
当使用 Bash 变量进行 sed 替换时,重要的是要使用双引号而不是单引号。单引号内的变量不会在 Bash 中被替换。
以下是如何使用 Bash 变量进行 sed
替换的代码示例:
bash
#!/usr/bin/env bash
name="John"
echo "Hello $name"
echo "Hello $name" | sed "s/John/Bob/g"
echo "Hello $name" | sed "s/$name/Bob/g"
如果你必须要使用单引号,可以将字符串与双引号中的变量连接起来。这将限制相关部分的扩展,并防止感叹号!
、反引号等的意外扩展。
那么,上述示例代码最后一行可以写为:
bash
echo "Hello $name" | sed 's/'"$name"'/Bob/g'
问题中的代码可以改写为:
bash
sed 's/draw('"$old_num"';n_)/draw('"$new_num"';n_)/g' file.txt > tmp
另外,除非你需要保留原文件的内容,否则你可以使用 -i
标志就地更改文件:
bash
sed -i "s/draw($old_num;n_)/draw($new_num;n_)/g" file.txt
参考:
- stackoverflow question 7680504
- man sed
- Bash中单引号和双引号的区别
相关阅读: