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>

내 목표는 두 개의 서로 다른 행에서 구문 분석되고 예약된 공간을 사용하여 함께 재조립되는 다음 결과를 얻는 것입니다.

제안된 출력

무엇이되어야합니까?첫 번째 게임상표구분 기호로두 번째 게임

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"

내 문제는 예약된 공간을 올바르게 사용하는 것과 결합됩니다. 나는 여러 가지 변형을 시도했습니다. 하지만 당시에는 직업을 가진 사람이 아무도 없었습니다. 즉

sed -rne 's/.*<h4 class=.*>(.*)<\/h4>/\1/i;h' -e "s/.*playpls', '(.*)\/listen.pls'.*/\1/;G;p"

답변1

만약 너라면~ 해야 하다(XSLT 대신) 또는 예약된 공간을 사용하는 방법을 더 잘 이해 하려면 sed다음을 수행해야 합니다.

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매우 좋은 도구라는 것입니다.

관련 정보