web-dev-qa-db-ja.com

bashを使用してコンマ区切りのリストをhtmlにエクスポートする

カスタムhtmlに変換したいcxommaで区切られたcsvがあり、それを実行する別のスクリプトに遭遇しましたが、使用してから問題になっています https://www.tutorialspoint .com/execute_bash_online.php 実行します。

私が見つけたスクリプトは次のとおりです: https://unix.stackexchange.com/questions/105501/convert-csv-to-html-table

私の問題は、私の出力が少し異なる必要があるということです、そしてECHOについての何かが本当に戦いを繰り広げています。だからここに私のリストの例があります:

Product、100 usdこのスクリプトを使用して、次のように変換します。Product100米ドル

基本的にリストを2つのセルに分割します。しかし、echoは "を削除し続けるので、それはただの混乱です。bashエミュレーターが行を折り返すためかどうかはわかりませんが、エラーが発生し続けます。> <およびtrとtdがコマンドであると想定しているようです。 。

現在、私のスクリプトは次のようになっています。これは、エコーにどれだけ苦労したかを反映しています。

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
Aryat Mapreh

引用符が間違っています。具体的には、二重二重引用符です。

あなたが持っているものを分解してみましょう、ビットは一緒に連結されています

echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
  1. エコーコマンド
  2. 空の文字列""
  3. リダイレクト<tr-これは「ファイルが見つかりません」エラーの原因です
  4. 空間
  5. 文字列 onmouseover="this.style.backgroundColor='#ffff66';"
  6. 開いた引用符とセミコロン、次の文字列の最初の文字

エコーコマンドを修正するには:

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

一重引用符と二重引用符が混在している場合、ヒアドキュメントは非常に読みやすくなります。また、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
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

制御オペレーター
制御機能を実行するトークン。これは、次の記号の1つです。

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

だから私は何年もの間Shellでスクリプトを作成しておらず、何年も使用していませんでした..しかし、私はあなたが提示した後者のソリューションを試しました。 shtest2.shそれは空白だけを返します。

最初の解決策を試すと、次のようになります。〜 $ cat price.csv | sh test2.sh test2.sh:4:test2.sh:構文エラー:予期しないリダイレクト

だから、私がソリューション#2を間違って使用しているかどうかわからない、そしてソリューション#1がまだそれをしている理由がわからないのですか?

0
Aryat Mapreh