用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

参考:


相关阅读:

相关推荐
杜子不疼.1 分钟前
【Linux】进程概念(六):地址空间核心机制
linux·运维·服务器
g***96902 分钟前
在Nginx上配置并开启WebDAV服务的完整指南
java·运维·nginx
2401_840192273 分钟前
curl -v 对于运维来说,比f12可能更适合
运维
APIshop3 分钟前
1688 拍立淘接口 item_search_img 返回值超细说明
linux·运维·服务器
礼拜天没时间.3 分钟前
《Grafana 企业级可视化监控实战指南:从安装、配置到智能告警》:Grafana 安装部署
linux·运维·信息可视化·zabbix·grafana·监控
丸码5 分钟前
JDK1.8新特性全解析
linux·windows·python
特种加菲猫5 分钟前
解码TCP:如何实现可靠的数据传输
linux·网络·网络协议·tcp/ip
Dest1ny-安全6 分钟前
CTF 及网络安全相关平台汇总表
java·运维·服务器·python·安全·web安全
小兔薯了7 分钟前
12.SMB 服务器
android·运维·服务器·nginx·php
序属秋秋秋11 分钟前
《Linux系统编程之进程环境》【地址空间】
linux·运维·服务器·c语言·c++·系统编程·进程地址空间