使用 bash 将逗号分隔列表导出为 html

使用 bash 将逗号分隔列表导出为 html

我有一个 cxomma 分隔的 csv,我想将其转换为自定义 html,并且我遇到了另一个可以做到这一点的脚本,但是自从我使用以来,它对我来说一直都是问题https://www.tutorialspoint.com/execute_bash_online.php来运行它。

这是我找到的脚本:https://unix.stackexchange.com/questions/105501/convert-csv-to-html-table

我的问题是我的输出需要有点不同,而 ECHO 确实有些问题。下面是我的列表示例:

产品,100 美元现在使用此脚本我想将其转换为如下形式:产品100 美元

基本上将列表分成 2 个单元格。但是 echo 不断删除 ",所以它只是一团糟。我不知道是不是因为 bash 模拟器会换行,但我一直收到错误,它似乎假设 >< 和 tr 以及 td 是命令。

目前我的脚本看起来是这样的,它反映了我在 echo 方面遇到的困难程度:

while read INPUT ; do
echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
echo ""onmouseout="this.style.backgroundColor='#d4e3e5';>";
echo ""<td>${INPUT//,/</td><td><b>}</b></td></tr>";""
done

并生成:

$bash -f main.sh
main.sh: line 2: tr: No such file or directory
main.sh: line 4: ;
echo <td>six</td><td><b>nine</td><td><b>twelve</b></td></tr>: No such file or directory
main.sh: line 4: : command not found 

我已经疯狂地尝试了 echo,但现在我已经束手无策了。非常感谢大家的帮助。

答案1

您的引用是错误的,特别是双引号。

让我们分解一下你所拥有的,将各个部分串联起来

echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
  1. echo 命令
  2. 空字符串""
  3. 重定向<tr——这就是“文件未找到”错误的来源
  4. 空间
  5. 字符串onmouseover="this.style.backgroundColor='#ffff66';"
  6. 一个开引号和分号,下一个字符串的第一个字符

要修复您的 echo 命令:

while read INPUT ; do
echo "<tr onmouseover=\"this.style.backgroundColor='#ffff66'\""
echo "onmouseout="this.style.backgroundColor='#d4e3e5'>"
echo "<td>${INPUT//,/<\/td><td><b>}</b></td></tr>"
done

当您混合使用单引号和双引号时,heredoc 的可读性非常高。此外,使用命令read来分隔 CSV 行。

while IFS=, read -r first second ; do
    cat <<END_HTML
        <tr onmouseover="this.style.backgroundColor='#ffff66'" onmouseout="this.style.backgroundColor='#d4e3e5'">
        <td>$first</td><td><b>$second</b></td>
        </tr>
END_HTML
done

答案2

我认为您可能对 echo 搞错了方向,可能 sed 或 awk 或 perl 或其他东西可能是更好的解决方案,但只是为了让您的 echo 字符串工作,您可以转义您想要打印的双引号和美元符号,例如:

#Added  \                 \                                      \
$ echo "\"<tr onmouseover=\"this.style.backgroundColor='#ffff66';\"";
"<tr onmouseover="this.style.backgroundColor='#ffff66';"

$ echo "\"onmouseout=\"this.style.backgroundColor='#d4e3e5';>"
"onmouseout="this.style.backgroundColor='#d4e3e5';>

$ echo "\"<td>\${INPUT//,/</td><td><b>}</b></td></tr>\";\""
"<td>${INPUT//,/</td><td><b>}</b></td></tr>";"

man bash有更多信息,请参阅引用部分,并注意以下事项:

元字符
不加引号时用于分隔单词的字符。以下之一:

|  & ; ( ) < > space tab newline

控制运算
符 执行控制功能的标记。它是以下符号之一:

|| & && ; ;; ;& ;;& ( ) | |& <newline>

答案3

所以我很久没有用 shell 编写脚本了,更不用说用它很多年了。但我确实尝试了你提出的后一种解决方案,当我这样做时:cat prices.csv | sh test2.sh 它只返回空白。

当我尝试第一个解决方案时,我得到:~$ cat prices.csv |sh test2.sh test2.sh: 4: test2.sh: 语法错误:意外重定向

所以不确定我是否错误地使用了解决方案#2,并且不知道为什么解决方案#1仍然会产生这样的效果?

相关内容