저는 이번 주에 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>
내 목표는 두 개의 서로 다른 행에서 구문 분석되고 예약된 공간을 사용하여 함께 재조립되는 다음 결과를 얻는 것입니다.
제안된 출력
무엇이되어야합니까?첫 번째 게임ㅏ상표구분 기호로두 번째 게임
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&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
매우 좋은 도구라는 것입니다.