SED 多行替换和保留空间

SED 多行替换和保留空间

本周我花了一些时间尝试了解更多 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&amp;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&amp;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&amp;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&amp;title=Rádio Club 88 FM&amp;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&amp;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是一个非常好的工具。

相关内容