使用bash sed编辑html文件

时间:2010-12-16 21:07:12

标签: html linux bash sed terminal

我在bash中生成了一个html表,将其存储在变量中,需要用它替换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>

解决!部分归功于Ignacio Vazquez-Abrams。

这就是我将'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 个答案:

答案 0 :(得分:1)

你的env var中有一个/。使用不同的分隔符。

s!foo!bar!g

答案 1 :(得分:0)

只需指定一次输出文件即可删除大量重复。

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

您可能根本不需要第一个临时文件。

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

为什么在一次调用AWK时可以使用所有echoawk命令?

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命令中执行了一些捕获组,但未使用它们。目前还不清楚你的意图是什么。

顺便说一句,seddf不属于Bash。它们是独立的实用程序。