2011-10-10 58 views
0

我很难过。我有一个HTML文件,我试图将其转换为纯文本,并使用sed进行清理。据我所知,sed适用于'流',一次只能处理一行,但有多种方法可以匹配多行模式。
这里是我的源文件的相关部分:Sed程序 - 删除的字符串重新出现?

<h1 class="fn" id="myname">My Name</h1> 
<span class="street-address">123 street</span> 
<span class="locality">City</span>&nbsp; 
<span class="region">Region</span>&nbsp;&nbsp; 
<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]\(&nbsp;\)*@@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>&nbsp;&nbsp; <span class="postal-code">1A1 A1A</span> 
[email protected] 
000-000-0000 

要我(相对缺乏经验的)眼睛,它看起来像sed是“遗忘”它所做的更改(剥去标签)。我将如何解决这个问题?解决方案是在三条命令之后写入文件,并重新运行sed以获得第四条命令?我滥用sed吗?我误解了'流'部分?

我使用bash外壳程序运行Mac OS X 10.4.11,并使用它随附的sed版本。

+0

你可能使用'awk'有更好的运气,因为这其中有你处理,你可以填入实际变量该文件,然后写在最后。 –

回答

1

我觉得你很困惑。 Sed一行一行地运行,并在移动到下一行之前运行线路上的所有命令。您似乎认为它将所有行上的标签剥离,然后返回并运行剥离线上的其余命令。事实并非如此。

+0

我可能是(因为我还在学习)。这很可能是我的错误,因为这正是我所假设的。那么我将不得不重新思考我的剧本。 –

0

请参阅RegEx match open tags except XHTML self-contained tags ...并停止使用sed。

Sed是一个很棒的工具,但不适用于处理HTML。我建议使用Python和BeautifulSoup,它基本上是为这类任务而构建的。

+0

这非常有趣。不幸的是,我对Python没有任何经验。我正在尝试使用sed,因为我知道一些它,我真的需要一个快速和肮脏的解决方案。我会研究这个BeautifulSoup,因为如你所说,它是为此量身定制的。 –

0

如果每个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>&nbsp; 
<span class="region">Region</span>&nbsp;&nbsp; 
<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/&nbsp;//g' t |sed '1G;3{N;N; s/\n/ /g}' 
My Name 

123 street 
City Region 1A1 A1A 
[email protected] 
000-000-0000