2

I've got a cxomma-separated csv that I want to turn into custom html, and I ran into another script which did it, but it's been nothing but issues for me since I use https://www.tutorialspoint.com/execute_bash_online.php to run it.

Here's the script I found: https://unix.stackexchange.com/questions/105501/convert-csv-to-html-table

My problem is that my output needs to be a bit different, and something about ECHO is really putting up a fight. So here's an example of my list:

Product,100 usd Now using this script I want to convert that to look like: Product100 usd

Basically separating the list into 2 cells. But echo keeps stripping out "'s so it's just a mess. I don't know if it's because the bash emulator wraps lines, but I keep getting errors, where it seems to assume >< and tr as well as td is a command.

Currently my script looks like this, and it reflects how much i've stuggled with 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

And that generates:

$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 

I've experimented like crazy with echo, but now I'm at my wit's end. Any and all help greatly and gratefully accepted.

3 Answers 3

7

Your quoting is wrong, specifically the double double-quotes.

Let's break down what you have, the bits concatenated together

echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
  1. the echo command
  2. an empty string ""
  3. a redirection <tr -- this is where the "file not found" error comes from
  4. a space
  5. a string onmouseover="this.style.backgroundColor='#ffff66';"
  6. an open quote and semicolon, the first character of the next string

To fix your echo commands:

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

When you have a blend of single and double quotes, a heredoc is very readable. Also, use the read command to separate your CSV line.

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
1
  • 2
    echo doesn't read from stdin, so a heredoc would not be useful here. Perhaps you meant to use cat in that last snippet instead?
    – jwodder
    Oct 21, 2018 at 3:12
2

I think you're probably barking up the wrong tree with echo, probably sed or awk or perl or something else might be a better solution, but to just get your echo strings working you could escape the double-quotes and dollar signs you want printed, like:

#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 has a lot more info, see the section on Quoting, and watch out for things like:

metacharacter
A character that, when unquoted, separates words. One of the following:

|  & ; ( ) < > space tab newline

control operator
A token that performs a control function. It is one of the following symbols:

|| & && ; ;; ;& ;;& ( ) | |& <newline>
1
  • Ok, so let's forget echo .. what am I looking at in whatever's more convenient, like sed, awk or perl? Oct 21, 2018 at 10:47
0

SO I've not scripted in shell in ages, much less used it for years .. But i did try the latter solution you presented, and when i do: cat prices.csv | sh test2.sh it returns nothing but blanks.

When i try the first solution I get: ~$ cat prices.csv |sh test2.sh test2.sh: 4: test2.sh: Syntax error: redirection unexpected

So not sure if im using solution #2 wrong, and dont know why solution #1 does that still?

1
  • The files im using is comma separated textfiles, not csv's, forgot this. Oct 21, 2018 at 8:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .