MacOS Ventura下用sed插入HTML meta标签报错,求修复方法
修复MacOS下sed插入meta标签的错误
错误原因
MacOS自带的是BSD版本sed,和Linux的GNU sed语法存在差异:
- BSD sed的
a(追加)命令要求,必须在a后添加反斜杠\,才能指定要插入的内容; - 原脚本未指定输入文件,且直接用
>重定向会先清空目标文件,导致sed无法读取原文件内容。
另外需要注意:原脚本的插入顺序和你要求的顺序相反,必须调整-e选项的执行顺序才能得到正确的标签排列。
修复后的脚本(推荐写法)
使用-i选项直接修改原文件(-i ''表示不生成备份文件),同时适配BSD sed语法并调整插入顺序:
#!/bin/bash sed -i '' \ -e '/<head>/a\ <meta http-equiv="cache-control" content="no-cache">\ ' \ -e '/<head>/a\ <meta http-equiv="expires" content="0">\ ' \ -e '/<head>/a\ <meta http-equiv="pragma" content="no-cache">\ ' public/index.html
关键细节说明
/<head>/:匹配index.html中的<head>行(无需转义<和>,sed模式中它们没有特殊含义);a\:BSD sed要求的追加命令前缀,后面换行写入要插入的meta标签;-i '':BSD sed的-i选项必须指定备份后缀,空字符串表示直接修改原文件不备份;- 执行顺序:按
-e选项的顺序依次插入,第一个-e插入cache-control标签,最后插入pragma标签,完全符合你要求的顺序。
替代写法(同一行完成)
如果想把插入内容和命令写在同一行,可以这样写(可读性稍差):
#!/bin/bash sed -i '' \ -e '/<head>/a\<meta http-equiv="cache-control" content="no-cache">' \ -e '/<head>/a\<meta http-equiv="expires" content="0">' \ -e '/<head>/a\<meta http-equiv="pragma" content="no-cache">' public/index.html
内容的提问来源于stack exchange,提问作者terett
相关产品推荐
相关产品推荐

