Linux下如何使用sed替换两行间内容为变量值并覆盖原文件
解决方案
核心问题原因
你写的命令使用单引号包裹sed脚本,shell不会对单引号内的$str1做变量展开,所以$str1会被当成普通字符串处理,无法替换为变量的实际取值。
GNU Sed(Linux 环境通用写法)
直接使用双引号包裹sed脚本,同时加上-i参数实现原位覆盖原文件:
sed -i "/BEGIN/,/END/c\BEGIN\n$str1\nEND" file
BSD Sed(macOS 环境适配写法)
macOS自带的sed要求-i参数必须显式指定备份文件后缀,不需要备份的话传空字符串即可:
sed -i '' "/BEGIN/,/END/c\BEGIN\n$str1\nEND" file
跨环境兼容写法(推荐)
如果需要兼顾不同系统环境,可以指定备份后缀,执行完成后手动删除备份文件即可:
# 执行替换时自动生成备份文件file.bak,替换完成后删除备份 sed -i.bak "/BEGIN/,/END/c\BEGIN\n$str1\nEND" file && rm file.bak
注意事项
如果你的$str1变量内容里包含斜杠/、反斜杠\这类sed特殊字符,需要提前对特殊字符做转义处理,避免出现sed语法解析错误。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

