Sed程序 - 删除的字符串重新出现?
我很难过。我有一个HTML文件,我试图将其转换为纯文本,并使用sed
进行清理。据我所知,sed
适用于'流',一次只能处理一行,但有多种方法可以匹配多行模式。
这里是我的源文件的相关部分:Sed程序 - 删除的字符串重新出现?
<h1 class="fn" id="myname">My Name</h1>
<span class="street-address">123 street</span>
<span class="locality">City</span>
<span class="region">Region</span>
<span class="postal-code">1A1 A1A</span>
<span class="email">[email protected]</span>
<span class="tel">000-000-0000</span>
我想这个被制作成以下明文格式:
My Name
123 street
City Region 1A1 A1A
[email protected]
000-000-0000
的关键在于,城市,地区和邮政编码现在都在一条线上。
我用sed -f commands.sed file.html > output.txt
,我相信下面的sed程序(),应该把它放在格式:
#using the '@' symbol as delimiter instead of '/'
#remove tags
[email protected]<.*>\(.*\)</.*>@\[email protected]
#remove the nbsp
[email protected]\( \)*@@g
#add a newline before the address (actually typing a newline in the file)
[email protected]\(123 street\)@\
\[email protected]
#and now the command that matches multiline patterns
#find 'City',read in the next two lines, and separate them with spaces
/City/ {
N
N
[email protected]\(.*\)\n\(.*\)\n\(.*\)@\1 \2 \[email protected]
}
似乎是有道理的。标签全部被剥离,然后三条线被放入一个。
Buuuuut它不会那样工作。下面是结果我得到:
My Name
123 street
City <span class="region">Region</span> <span class="postal-code">1A1 A1A</span>
[email protected]
000-000-0000
要我(相对缺乏经验的)眼睛,它看起来像sed是“遗忘”它所做的更改(剥去标签)。我将如何解决这个问题?解决方案是在三条命令之后写入文件,并重新运行sed以获得第四条命令?我滥用sed吗?我误解了'流'部分?
我使用bash
外壳程序运行Mac OS X 10.4.11,并使用它随附的sed
版本。
我觉得你很困惑。 Sed一行一行地运行,并在移动到下一行之前运行线路上的所有命令。您似乎认为它将所有行上的标签剥离,然后返回并运行剥离线上的其余命令。事实并非如此。
我可能是(因为我还在学习)。这很可能是我的错误,因为这正是我所假设的。那么我将不得不重新思考我的剧本。 –
请参阅RegEx match open tags except XHTML self-contained tags ...并停止使用sed。
Sed是一个很棒的工具,但不适用于处理HTML。我建议使用Python和BeautifulSoup,它基本上是为这类任务而构建的。
这非常有趣。不幸的是,我对Python没有任何经验。我正在尝试使用sed,因为我知道一些它,我真的需要一个快速和肮脏的解决方案。我会研究这个BeautifulSoup,因为如你所说,它是为此量身定制的。 –
如果每个PHP文件只有一个数据块,请尝试以下(使用SED)
kent$ cat t
<h1 class="fn" id="myname">My Name</h1>
<span class="street-address">123 street</span>
<span class="locality">City</span>
<span class="region">Region</span>
<span class="postal-code">1A1 A1A</span>
<span class="email">[email protected]</span>
<span class="tel">000-000-0000</span>
kent$ sed 's/<[^>]*>//g; s/ //g' t |sed '1G;3{N;N; s/\n/ /g}'
My Name
123 street
City Region 1A1 A1A
[email protected]
000-000-0000
你可能使用'awk'有更好的运气,因为这其中有你处理,你可以填入实际变量该文件,然后写在最后。 –