用Bash变量进行sed替换

问题:

我试图在一个 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

参考:


相关阅读:

相关推荐
荒--15 分钟前
Ubuntu软件包查询,弹框下载文件
运维·服务器·ubuntu
‎ദ്ദിᵔ.˛.ᵔ₎37 分钟前
Linux:对有关 SIGCHLD 的深层理解
linux·运维·服务器
aichitang20241 小时前
QCU 2.0.0:补齐 Windows、Linux 与 GNOME Wayland
linux·运维·windows·ai·agent·ai编程
Lv_沐曦1 小时前
Linux 上的Web文件管理器-filebrowser
linux·运维·服务器
闲云自留地1 小时前
CentOS 搬 Ubuntu 24.04:yum 变 apt、防火墙、SELinux、root 全差异避坑
linux·ubuntu·centos
科技每日热闻1 小时前
电气设备综合维保服务商怎么选?从预防性维护到数字化运维,看懂五个关键能力——企业选择维保合作伙伴,不能只看“坏了能不能修”,更要看能否覆盖资产与系统的长期运营
大数据·运维·人工智能
最强小杰2 小时前
Claude Opus 4.8 调用报 529 怎么办?并发限制触发过载——退避策略与降级方案完整指南
运维·网络·python·ai
我科绝伦(Huanhuan Zhou)2 小时前
磐维数据库(PanWeiDB)日常运维命令总结
运维·数据库
深盾科技_Virbox2 小时前
软许可、加密锁和云许可混合使用时,授权接口应该怎么统一?
运维·网络·安全