在while循环中传递变量给Awk时执行失败的问题求助(从index.db生成HTML场景)
靠谱的解决方案
其实不用搞这么复杂的sed+read+awk组合,直接用awk就能一站式处理整个文件,简洁又可靠:
方案一:直接用awk处理index.db(推荐)
awk ' # 跳过空行 /^$/ { next } # 处理每一行 { # 用正则匹配提取每个字段的值 match($0, /file="([^"]+)"/, file_arr); file = file_arr[1] match($0, /date="([^"]+)"/, date_arr); date = date_arr[1] match($0, /title="([^"]+)"/, title_arr); title = title_arr[1] # 输出HTML内容 print "<h1>" title "</h1>" print "<b>" date "</b>" print "<a href=\"" file "\">" file "</a>" print "<hr>" # 可选,加个分隔线让条目更清晰 } ' input/index.db > output.html
这个命令直接读取input/index.db的每一行,用正则精准提取file、date、title的值,然后输出对应的HTML标签,最后把结果写入output.html文件。
方案二:修复原有的命令结构(不推荐,有安全风险)
如果你非要用原来的sed+read+awk流程,得先把shell读取的行解析成变量,再传递给awk:
sed '/^$/d' input/index.db | while read -r line; do # 解析行里的键值对为shell变量 eval "$line" # 用-v选项把shell变量传给awk awk -v file="$file" -v date="$date" -v title="$title" ' BEGIN { print "<h1>" title "</h1>" print "<b>" date "</b>" print "<a href=\"" file "\">" file "</a>" } ' done > output.html
⚠️ 注意:这里用了eval来解析行内容,要是index.db里有恶意代码,可能会执行危险操作,所以除非你完全信任文件内容,否则别用这个方案。
内容的提问来源于stack exchange,提问作者S9oXavyF
相关产品推荐
相关产品推荐

