我有一个 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';"";
- echo 命令
- 空字符串
""
- 重定向
<tr
——这就是“文件未找到”错误的来源 - 空间
- 字符串
onmouseover="this.style.backgroundColor='#ffff66';"
- 一个开引号和分号,下一个字符串的第一个字符
要修复您的 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仍然会产生这样的效果?