用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

参考:


相关阅读:

相关推荐
万象.5 小时前
Linux传输层TCP,UDP相关内容
linux·tcp/ip·udp
耀耀_很无聊5 小时前
09_Jenkins安装JDK环境
java·运维·jenkins
MaximusCoder5 小时前
等保测评命令——Centos Linux
linux·运维·经验分享·python·安全·centos
万象.5 小时前
Linux数据链路层通信原理及报文格式
linux·网络·网络协议
卷Java6 小时前
Linux服务器Docker部署OpenClaw:腾讯云/阿里云/VPS安装避坑指南
linux·运维·服务器
原来是猿7 小时前
Linux-【动静态库】
linux·运维·服务器
深圳市恒讯科技8 小时前
云服务器怎么选?从CPU、内存到IOPS的零基础选型手册
运维·服务器
艾莉丝努力练剑9 小时前
【脉脉】AI创作者崛起:掌握核心工具,在AMA互动中共同成长
运维·服务器·c++·人工智能·安全·企业·脉脉
九皇叔叔9 小时前
CentOS 7.5/RHEL 7.x 配置 YUM 源(阿里云镜像+本地源双方案)
linux·阿里云·centos
chinesegf10 小时前
DNS 验证验证SSL证书
linux·服务器·网络