我很难过。我有一个HTML文件,我正在尝试将其转换为纯文本,我正在使用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">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@\( \)*@@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> <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
版本。
答案 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>
<span class="region">Region</span>
<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/ //g' t |sed '1G;3{N;N; s/\n/ /g}'
My Name
123 street
City Region 1A1 A1A
my@email.ca
000-000-0000