如何自动执行sed替换CSV中GDATEF变量后生成的date命令输出
解决方案
你当前用多轮sed拼接date命令的逻辑冗余且容易出转义问题,推荐以下两种实现方案:
方案1:直接匹配变量并替换为计算结果(优先推荐)
该方案不需要先生成date命令再执行,直接提取变量中的日期偏移量,计算出结果后直接替换回CSV,全程无额外转义处理,也避免了执行动态命令的安全风险。
完整脚本如下:
#!/usr/bin/env bash # 传入CSV文件路径作为第一个参数 if [ ! -f "$1" ]; then echo "请输入有效的CSV文件路径" exit 1 fi tmp_file=$(mktemp) # 逐行处理CSV内容 while IFS= read -r line || [ -n "$line" ]; do # 循环匹配行内所有${GDATEF(偏移量D,ddMMyyyy)}格式的变量 while [[ $line =~ \$\{GDATEF\((-?[0-9]+)D,ddMMyyyy\)\} ]]; do # 提取日期偏移量(比如-4) offset="${BASH_REMATCH[1]}" # 计算对应日期 target_date=$(date -d "${offset} days" +"%d/%m/%Y") # 把匹配到的变量替换为日期结果 line=${line//"${BASH_REMATCH[0]}"/$target_date} done echo "$line" >> "$tmp_file" done < "$1" # 覆盖原文件 mv "$tmp_file" "$1"
方案2:基于你现有逻辑补全自动执行步骤
如果你要保留原有sed替换逻辑,可在三轮sed执行完成后添加以下代码,自动修正转义字符并执行date命令替换为结果:
tmp_file=$(mktemp) while IFS= read -r line || [ -n "$line" ]; do # 匹配生成的date命令行 if [[ $line == date\ -d* ]]; then # 去除多余的转义符 fixed_cmd=$(echo "$line" | sed 's/\\\?"/"/g') # 执行命令拿到日期结果 target_date=$(eval "$fixed_cmd") echo "$target_date" >> "$tmp_file" else echo "$line" >> "$tmp_file" fi done < "$1" mv "$tmp_file" "$1"
注意:该方案使用了eval执行动态命令,若CSV中存在不可信内容,有代码注入风险,仅建议在文件内容完全可控的场景下使用。
内容的提问来源于stack exchange,提问作者ziwdig44bugs
相关产品推荐
相关产品推荐

