題 使用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 usd   現在使用這個腳本我想將其轉換為:   產品100 usd

基本上將列表分成2個單元格。但迴聲一直在剝離“所以它只是一團糟。我不知道是不是因為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 

我已經用迴聲瘋狂地進行了實驗,但現在我已經完成了我的智慧。任何和所有的幫助大大和感激地接受。


2
2017-10-21 01:29


起源




答案:


你的引用是錯誤的,特別是雙引號。

讓我們分解你所擁有的,連接在一起的位

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

7
2017-10-21 02:29



echo 不會從stdin讀取,因此heredoc在這裡不會有用。也許你打算用 cat 而在最後一段代碼? - jwodder
噢,當然。謝謝你的糾正 - glenn jackman


我想你可能用迴聲咆哮錯誤的樹,可能是sed或awk或者perl或者別的東西可能是更好的解決方案,但是為了讓你的回音串工作你可以逃脫你想要打印的雙引號和美元符號, 喜歡:

#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>

2
2017-10-21 09:41



好吧,讓我們忘記迴聲......我在看什麼更方便的東西,比如sed,awk或perl? - Aryat Mapreh


所以我多年來沒有用shell編寫腳本,更不用多年了。但是我確實嘗試了你提出的後一種解決方案,當我這樣做時:cat prices.csv | sh test2.sh它只返回空白。

當我嘗試第一個解決方案時,我得到: 〜$ cat prices.csv | sh test2.sh test2.sh:4:test2.sh:語法錯誤:重定向意外

所以不確定我是否使用解決方案#2錯誤,並且不知道解決方案#1為什麼會這樣做呢?


0
2017-10-21 08:08



我使用的文件是逗號分隔的文本文件,而不是csv的,忘了這個。 - Aryat Mapreh