1

我尝试为以下数据编写一个 shell 脚本

输入文件page.txt的内容:

enter a first page title<br><div style="margin-left: 40px;">enter a first point <br></div><div style="margin-left: 80px;">enter a second point<br></div><div style="margin-left: 120px;">enter a third point<br></div><div style="margin-left: 80px;"><br></div><div style="margin-left: 40px;"><br></div><div style="margin-left: 40px;"><br></div>

算法 :

Read the pages file
Replace <br> with newline
Replace <div style="margin-left: 40px;"> with 1 tab 
Replace <div style="margin-left: 80px;"> with 2 tab
Replace <div style="margin-left: 120px;"> with 3 tab
Replace <div style="margin-left: 160px;"> with 4 tab

我正在尝试使用它

tr '<br>' '\n' < page.txt

预期的输出文件

enter a first page title
    enter a first point 
        enter a second point
            enter a third point

请告诉告诉如何编写上面提到的脚本..

4

2 回答 2

1

我不喜欢在没有解析器的情况下处理 XML 标记,但在这种特定情况下,您的数据对它来说似乎很奇怪(格式错误),因此和在替换命令中评估替换字符串的选项是解决方案的好工具。

我使用了三个替换命令,第一个<br>用换行符替换所有,第二个删除所有关闭div标签,第三个查找打开div标签,提取属性的数量并使用它来计算有多少个制表符插入:

perl -pe '
    s/<br>/\n/g; 
    s{</div>}{}g; 
    s{\Q<div style="margin-left: \E(\d+)\s*\Qpx;">}{"\t" x ($1/40)}ge
' infile

它产生:

enter a first page title
    enter a first point 
        enter a second point
            enter a third point
于 2013-07-23T08:11:40.627 回答
0

最简单的方法是将行尾(不是\n,而是行尾)替换为<br>,如下所示:

(echo line one; echo line two) | sed -e 's/$/<br>/'

或者在你的情况下:

sed -e 's/$/<br>/' < inputfile

替换行首的制表符的方法类似,使用插入符号作为行首标记。作为一个完整的脚本:

TAB="$(echo -e "\t")"
sed -e "s/^$TAB$TAB$TAB$TAB\(.*\)/<div style=\"margin-left: 160px;\">\1<\/div>/ \
    -e "s/^$TAB$TAB$TAB\(.*\)/<div style=\"margin-left: 120px;\">\1<\/div>/ \
    -e "s/^$TAB$TAB\(.*\)/<div style=\"margin-left: 80px;\">\1<\/div>/ \
    -e "s/^$TAB\(.*\)/<div style=\"margin-left: 40px;\">\1<\/div>/ \
    -e 's/$/<br>/' \
   < inputfile > outputfile

注1:\末尾的意思是续行,所以上面是2个语句。

注意 2:我假设您也希望 a</div>在行尾,只是为了显示/in的转义</div>

请注意,对于更复杂的事情,您应该考虑使用正确的提取和正则表达式语言,例如 Perl。您可能会想要做一些事情,比如将多行以相同的方式一对一地缩进<div>

于 2013-07-23T08:04:42.793 回答