如何向sed命令传入文件参数替换${GDATEF(...)}格式日期占位符
你遇到的报错核心是双引号包裹sed脚本导致的转义提前解析问题:双引号作用域下,shell会先解析脚本里的转义符、反引号、变量,再把解析后的内容传给sed,导致sed拿到的命令和你预期的不一致,引号不闭合就会报unterminated command错误。
这里给出优化后的可用脚本,同时把原来的多步替换合并成单条更简洁的逻辑,易维护也不需要处理复杂转义:
#!/bin/bash # 校验传入参数有效性 if [ $# -ne 1 ] || [ ! -f "$1" ]; then echo "用法:$0 <目标文件路径>" exit 1 fi # 适配GNU sed(Linux)和BSD sed(macOS)的-i参数差异 SED_OPTS=(-i) if ! sed --version 2>/dev/null | grep -q "GNU sed"; then SED_OPTS=(-i '') fi # 执行全局替换 sed "${SED_OPTS[@]}" ' s/\${GDATEF\(-\?[0-9]\+\)D,ddMMyyyy}/date -d "\1 days" +%d\/%m\/%Y/ge ' "$1"
说明
- 正则直接捕获
${GDATEF()}内的正负天数,替换时直接作为date命令的参数计算对应日期,比如匹配到${GDATEF(-4D,ddMMyyyy)}就会自动执行date -d "-4 days" +%d/%m/%Y,输出减4天的对应日期 - 全程用单引号包裹sed脚本,避免shell提前解析内容,不需要额外处理多层转义
- 适配了不同系统的sed差异,Linux和macOS下都可以正常运行
- 执行前可以先去掉
-i相关参数运行,打印替换结果确认符合预期后再开启文件写入,避免误改文件内容
内容的提问来源于stack exchange,提问作者ziwdig44bugs
相关产品推荐
相关产品推荐

