本周我花了一些时间尝试了解更多 SED,并尝试了以下示例代码:
</td>
<td>
<h4 class="text-danger" style="display: inline;">**Rádio Club 88 FM**</h4>
<br>
<b></b><br>
<br>Genres: various<!--
<br><samp>19 http://67.228.135.41:8216/listen.pls shoutcast1 audio/mpeg</samp>
<div id="jplayer_inspector_19"></div>-->
</td>
<td width="120" class="text-right hidden-xs">
<p>
24 Listeners<br>
128 Kbps<br>
</p>
<a style="margin:1px" class="btn btn-default btn-xs" onClick="ga('send', 'event', 'tunein', 'playpls', 'http://67.228.135.41:8216/listen.pls');" href="/servers/tools/playlistgenerator/?u=http://67.228.135.41:8216/listen.pls&t=.pls">PLS</a>
<a style="margin:1px" class="btn btn-default btn-xs" onClick="ga('send', 'event', 'tunein', 'playm3u', 'http://67.228.135.41:8216/listen.pls');" href="/servers/tools/playlistgenerator/?u=http://67.228.135.41:8216/listen.pls&t=.m3u">M3U</a>
<a style="margin:1px" class="btn btn-default btn-xs" onClick="ga('send', 'event', 'tunein', 'playram', 'http://67.228.135.41:8216/listen.pls');" href="/servers/tools/playlistgenerator/?u=http://67.228.135.41:8216/listen.pls&t=.ram">RAM</a>
<a style="margin:1px" class="btn btn-default btn-xs" onClick="window.open('/player/?mount=http://67.228.135.41:8216/listen.pls&title=Rádio Club 88 FM&website=http://www.shoutcast.com','PopupPlayer','width=400,height=300'); ga('send', 'event', 'tunein', 'playpopup', 'http://67.228.135.41:8216/listen.pls');" href="#">FLA</a>
</td>
我的目标是获得以下结果,该结果将从两条不同的行解析并使用保留空间重新组合在一起
建议输出
应该是的内容第一场比赛A标签作为分隔符和第二场比赛
Soundzrise RADIO \t http://94.23.66.114:8122
::| ([bAm BaM RADIO]) |:: \t http://www.bambamradio.com:8888
NRGRadio.nl \t http://188.138.56.235:27914
我有两个可以使用的 SED 命令
第一场比赛
is the H4 line, i am extracting what is between the ">" and "<"
COMMAND =sed -rne 's/.*<h4 class=.*>(.*)<\/h4>/\1/ip'
第二场比赛
is the http address in line containing "playpls" -
Command = sed -rne "s/.*playpls', '(.*)\/listen.pls'.*/\1/p"
我的问题是与正确使用保留空间相结合。我尝试了几种变体。但当时没有人有工作。 IE
sed -rne 's/.*<h4 class=.*>(.*)<\/h4>/\1/i;h' -e "s/.*playpls', '(.*)\/listen.pls'.*/\1/;G;p"
答案1
如果你必须使用sed
(而不是 XSLT),或者如果您只是想更好地了解如何使用保留空间,那么您需要执行以下操作:
保存该H4
行以保留空间:
/<h4 /h
当您看到该playpls
行时,请附加保留空间:
/ 'playpls',/{
G
# do something here
}
现在,你的模式空间应该看起来像
<a style="margin:1px" class="btn btn-default btn-xs" onClick="ga('send', 'event', 'tunein', 'playpls', 'http://67.228.135.41:8216/listen.pls');" href="/servers/tools/playlistgenerator/?u=http://67.228.135.41:8216/listen.pls&t=.pls">PLS</a>
<h4 class="text-danger" style="display: inline;">**Rádio Club 88 FM**</h4>
(包括嵌入的换行符)。所以你可以用类似的东西替换该评论
s/.*'playpls', '\([^']*\)'.*\n.*<h4 [^>]*>\([^<>]*\).*/\2\t\1/p
并运行脚本,sed -n
以便仅打印与替换匹配的模式空间。
事实上,除非附加保留空间,否则您将无法获得匹配项,因此您可以在不使用大括号的情况下完成所有这些操作:
#!/bin/sed -rnf
# I've assumed GNU sed above
/<h4 /h
/ 'playpls',/G
/\n/s/.*'playpls', '([^']+)'.*\n.*<h4 [^>]+>([^<>]+).*/\2\t\1/p
答案2
我建议你做一些准备工作sed
。而不是完全采用多线。grep
两条线,然后使用 将它们折叠在一起paste
。这会为您提供两个匹配项位于同一行的行,仅此而已。从那里应该很容易选择两个参考文献,而根本不需要多行。
输入示例:
# echo 'first_a foo second_A bar first_b junk second_B crap' | tr ' ' '\n'
first_a
foo
second_A
bar
first_b
junk
second_B
crap
像这样工作:
# echo 'first_a foo second_A bar first_b junk second_B crap' | tr ' ' '\n' | \
grep -E 'first|second' | \
paste - - | \
sed -e 's/first_\([a-z]*\)[^a-z].*second_\([a-z]*\)/\1 \2/'
a A
b B
重点是它paste
是一个非常好的工具。