用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

参考:


相关阅读:

相关推荐
Xの哲學4 小时前
Linux grep命令:文本搜索的艺术与科学
linux·服务器·算法·架构·边缘计算
夜月yeyue4 小时前
Linux 调度类(sched_class)
linux·运维·c语言·单片机·性能优化
林义满5 小时前
运维转型让产线 “少掉链”:上海义满汽车零部件借智能运维降本增效,年减损失超 200 万
运维·汽车
VekiSon5 小时前
Linux系统编程——IPC进程间通信:信号通信与共享内存
linux·运维·服务器
南山nash5 小时前
CentOs7 安装 Docker 详细步骤
linux·运维·docker·容器
徐先生 @_@|||5 小时前
Conda最基础使用命令
linux·windows·conda
ZHHHHHJ666 小时前
LL层-PAST
运维·服务器·网络
wdfk_prog6 小时前
[Linux]学习笔记系列 -- [fs][drop_caches]
linux·笔记·学习
咩咩大主教6 小时前
VSCode远程连接Linux部署的Docker
linux·vscode·docker
名誉寒冰6 小时前
GDB 调试与 Core Dump(段错误)排查指南(Linux/C/C++)
linux·c语言·c++