Bash:格式化HTML中的列表元素

时间:2015-05-06 03:20:45

标签: html bash scripting

我没有bash经验,只想知道如何开始。

我必须编写一个正确格式化XHTML文档的bash脚本。例如,转为:

   <p>Test</p><ol><li>Test
    </li><li>
    Test</li></ol>

进入这个:

<p>Test</p>
<ol>
  <li>Test</li>
  <li>Test</li>
</ol>

现在我相信我必须做类似的事情:

cat > format1 #create file
#!bin/bash
if tail of a line ends with "</A-a>": (like </li> or </ol> or </p> or </ul>)
    add \n 
    fi

if head of a line = <ol> or <ul>
    add \n
    fi

请帮我理解。这是我能想到的全部,我真的想知道如何解决它。

5 个答案:

答案 0 :(得分:1)

使用html-tidy。如果您想使用.bashrc

,最好将其添加到tidy
alias tidy="tidy -xml --indent auto --indent-spaces 1 --quiet yes -im"

上面的命令创建一个alias表示将文件缩进为xml(确保所有标签都有结束标记),用单个空格缩进并修改文件。

答案 1 :(得分:1)

考虑到必须使用bash脚本解决问题的限制而你不能使用htmltidy,那么我开始创建一个包含以下内容的文件htmltidy.sh:

#!/bin/bash

echo $( cat )                       |\
    sed 's/\s*\(<[^>]\+>\)\s*/\1/g' |\
    sed 's/></>\n</g'               |\
    awk '{
        if ( $0 ~ /^<\/[^>]+>$/ ) indent=substr(indent,2);
        print indent$0;
        if ( $0 ~ /^<[^\/>][^>]+>$/ ) indent=indent" ";
    }'

要使用此程序,您可以将内容通过管道传输到其中:

cat sexist.html | ./xhtmltidy.sh

这至少可以根据您提供的示例输入进行操作。

一些解释:

  • cat将所有标准输入捕获为单行文本
  • sed剥离XHTML标记的前导和尾随空格
  • sed在相邻的XHTML标记之间添加换行符
  • 如果某行是结束XHTML标记(例如),则
  • awk减少缩进
  • awk打印带缩进的行
  • 如果一行是一个起始的XHTML标记,则
  • awk会增加缩进(例如 )

一旦输入的复杂性变得越来越复杂,这个玩具程序将很快破裂。但这会让你知道为什么使用现成的实用程序而不是编写自己的实用工具更好。

答案 2 :(得分:0)

我建议您查看html-tidy实用程序。

你不必自己编写一个格式化程序,有很多现有的实用程序可以帮助你,放弃它不是一项简单的任务,并且&#34;如何实现一个html漂亮的打印格式化程序& #34;这将是一个非常广泛的问题(广泛的问题反对StackOverflow规则)。

答案 3 :(得分:0)

HTML Tidy可能已经安装在您的系统上,它适合我,我不记得安装它。您可能想通过运行 -

进行检查
man tidy 

如果你拿到手册,那么你就可以摇滚了!

tidy -options oldFile.xhtml -output newFile.xhtml

答案 4 :(得分:0)

另一种可供选择的替代方法是xmllint,它可以安装在您的系统上:

xmllint --format <input-file>