Редактирование html файла с помощью bash sed - PullRequest
0 голосов
/ 17 декабря 2010

Я сгенерировал html-таблицу в bash, сохранил ее в переменной и мне нужно заменить на нее определенный регион в html.

sed -r -i~ -e "s/(var filesystem=)(.*)/var filesystem=\"$filesystem_table\";/g" ./Html/xmon/xmon.html

По сути, я включил df -h bashвывод в таблицу и хотите вставить ее с помощью javascript на мою страницу.

Все мои попытки возвращаются

sed: -e expression #1, char 40: unterminated `s' command

Нет ли более простого способа сделать это?

Значение $ filesystem_table: (исправлено)

<tr> <td> Filesystem </td> <td> Size </td> <td> Used </td> <td> Avail </td> <td> Use% </td> <td> Mounted </td> </tr> <tr> <td> /dev/sda1 </td> <td> 94G </td> <td> 80G </td> <td> 9.3G </td> <td> 90% </td> <td> / </td> </tr> <tr> <td> none </td> <td> 2.0G </td> <td> 328K </td> <td> 2.0G </td> <td> 1% </td> <td> /dev </td> </tr> <tr> <td> none </td> <td> 2.0G </td> <td> 2.4M </td> <td> 2.0G </td> <td> 1% </td> <td> /dev/shm </td> </tr> <tr> <td> none </td> <td> 2.0G </td> <td> 372K </td> <td> 2.0G </td> <td> 1% </td> <td> /var/run </td> </tr> <tr> <td> none </td> <td> 2.0G </td> <td> 0 </td> <td> 2.0G </td> <td> 0% </td> <td> /var/lock </td> </tr> <tr> <td> /dev/sda3 </td> <td> 198G </td> <td> 184G </td> <td> 15G </td> <td> 93% </td> <td> /media/Zeta </td> </tr> <tr> <td> /dev/mmcblk0p1 </td> <td> 7.7G </td> <td> 477M </td> <td> 7.2G </td> <td> 7% </td> <td> /media/NIKON </td> </tr>

Решено!Частично благодаря Игнасио Васкес-Абрамсу.

Вот как я преобразую выходной файл 'df -h' в HTML-таблицу:

df -h > /tmp/filesystem
            echo "<table>" > /tmp/filesystem_table
            cat /tmp/filesystem | while read line
            do
            echo "<tr>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $1; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $2; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $3; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $4; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $5; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "<td>" >> /tmp/filesystem_table
            echo $line | awk '{ print $6; }' >> /tmp/filesystem_table
            echo "</td>" >> /tmp/filesystem_table
            echo "</tr>" >> /tmp/filesystem_table
            done    
            echo "</table>" >> /tmp/filesystem_table

            filesystem_table="$($_CMD cat /tmp/filesystem_table)"
            filesystem_table="$($_CMD echo $filesystem_table)"  


            sed -r -i~ -e "s!(var filesystem=)(.*)!var filesystem=\"$filesystem_table\";!g" ./Html/xmon/xmon.html

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

У вас есть / в вашем env var. Используйте другой разделитель.

s!foo!bar!g
0 голосов
/ 17 декабря 2010

Вы можете удалить много повторений, указав выходной файл только один раз.

while ...
do
    ...
done >> /tmp/filesystem_table

Вам может вообще не понадобиться первый временный файл.

{
echo "<table>"
df -h  | while read line
         do
             echo "<tr>"
             ...
         done
}  > /tmp/filesystem_table

Зачем использовать все эти команды echo и awk, когда один вызов AWK может сделать все это?

df -h | awk 'BEGIN { OFS = "\n</td>\n<td>\n";
                     print "<table>" }

             NR == 1 { ORS = "\n</td>\n</tr>\n";
                       $6 = $6 " " $7; NF = 6}    # fix "Mounted on"

             {
                printf "%s\n%s\n", "<tr>", "<td>"
                $1=$1    # recompute the line with new OFS and ORS
                print
             }

            END { ORS = "\n"
                  print "</table>" }' > /tmp/filesystem_table

В вашей команде sed вы делаете несколько групп захвата, но не используете их. Непонятно, каково ваше намерение.

Кстати, sed и df не являются частью Bash. Это отдельные утилиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...