
私は今週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>
私の目標は、2つの異なる行で解析され、予約済みスペースを使用して一緒に再組み立てされる次の結果を得ることです。
提案された出力
何が必要ですか?最初のゲームㅏ商標区切り記号でセカンドゲーム
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
使用できる2つの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
2行を使って一緒に折りますpaste
。これにより、両方の一致が同じ行にある行が提供されます。ここでは、複数行をまったく使用せずに2つの参照を簡単に選択できます。
入力例:
# 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
非常に良いツールであるということです。