Sed程序 - 删除的字符串重新出现?

时间:2011-10-10 23:47:20

标签: regex macos unix sed

我很难过。我有一个HTML文件,我正在尝试将其转换为纯文本,我正在使用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">my@email.ca</span>
<span class="tel">000-000-0000</span>

我希望将其制作成以下明文格式:

My Name

123 street
City Region  1A1 A1A
my@email.ca
000-000-0000

关键是City,Region和Post代码现在都在一行上 我使用sed -f commands.sed file.html > output.txt,我相信以下sed程序(commands.sed)应该采用这种格式:

#using the '@' symbol as delimiter instead of '/'
#remove tags
s@<.*>\(.*\)</.*>@\1@g
#remove the nbsp
s@\(&nbsp;\)*@@g
#add a newline before the address (actually typing a newline in the file)
s@\(123 street\)@\
\1@g
#and now the command that matches multiline patterns
#find 'City',read in the next two lines, and separate them with spaces
/City/ {
N
N
s@\(.*\)\n\(.*\)\n\(.*\)@\1 \2  \3@g
}

似乎有道理。标签全部被剥离,然后三行被放入一个 Buuuuut这种方式不起作用。这是我得到的结果:

My Name

123 street
City <span class="region">Region</span>&nbsp;&nbsp;  <span class="postal-code">1A1 A1A</span>
my@email.ca
000-000-0000

对于我(相对缺乏经验)的眼睛,看起来sed正在“忘记”它所做的改变(剥离标签)。我该如何解决这个问题?解决方案是在三个命令后写入文件并重新运行第四个sed吗?我是否误用了sed?我是否误解了“流”部分?

我正在使用bash shell运行Mac OS X 10.4.11并使用随附的sed版本。

3 个答案:

答案 0 :(得分:1)

我觉得你很困惑。 Sed逐行操作,并在移动到下一行之前在线路上运行所有命令。您似乎假设它剥离了所有行上的标记,然后返回并在剥离的行上运行其余命令。事实并非如此。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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">my@email.ca</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
my@email.ca
000-000-0000