0

多くの行を含むファイルがあり、各行にいずれかの部分文字列があります

whatever_blablablalsfjlsdjf;asdfjlds;f/watch?v=yPrg-JN50sw&amp,whatever_blabla

また

whatever_blablabla"/watch?v=yPrg-JN50sw&amp" class=whatever_blablablavwhate

上記の「yPrg-JN50s」のような部分文字列を抽出したい

一致するパターンは、文字列 "/ watch?="の後の11文字です。

部分文字列を抽出する方法

私はそれがsedであることを願っています、そうでなければ1行でawk、pn行perlスクリプトも大丈夫です

4

6 に答える 6

4

できるよ

grep -oP '(?<=/watch\?v=).{11}'

grepPerl正規表現を知っている場合、または

sed 's/.*\/watch?v=\(.\{11\}\).*/\1/g'
于 2012-10-30T13:03:13.947 に答える
3
$ cat file
/watch?v=yPrg-JN50sw&amp
"/watch?v=yPrg-JN50sw&amp" class=
$
$ awk 'match($0,/\/watch\?v=/) { print substr($0,RSTART+RLENGTH,11) }' file
yPrg-JN50sw
yPrg-JN50sw
于 2012-10-30T13:05:18.853 に答える
2

シェルのパラメータ展開だけで、「watch?v=」の後に11文字を抽出します。

while IFS= read -r line; do
    tmp=${line##*watch?v=}
    echo ${tmp:0:11}
done < filename
于 2012-10-30T15:57:31.177 に答える
1

sedを使用して、無関係な情報を削除できます。

sed 's/[^=]\+=//; s/&.*$//' file

または、awkと賢明なフィールドセパレーターを使用します。

awk -F '[=&]' '{print $2}' file

内容file

cat <<EOF > file
/watch?v=yPrg-JN50sw&amp
"/watch?v=yPrg-JN50sw&amp" class=
EOF

出力:

yPrg-JN50sw
yPrg-JN50sw

コメントに記載されている新しい要件に対応する編集

cat <<EOF > file
<div id="" yt-grid-box "><div class="yt-lockup-thumbnail"><a href="/watch?v=0_NfNAL3Ffc" class="ux-thumb-wrap yt-uix-sessionlink yt-uix-contextlink contains-addto result-item-thumb" data-sessionlink="ved=CAMQwBs%3D&amp;ei=CPTsy8bhqLMCFRR0fAodowXbww%3D%3D"><span class="video-thumb ux-thumb yt-thumb-default-185 "><span class="yt-thumb-clip"><span class="yt-thumb-clip-inner"><img src="//i1.ytimg.com/vi/0_NfNAL3Ffc/mqdefault.jpg" alt="Miniature" width="185" ><span class="vertical-align"></span></span></span></span><span class="video-time">5:15</span> 
EOF

賢明なレコード区切り文字でawkを使用します。

awk -v RS='[=&"]' '/watch/ { getline; print }' file

この種のタスクには、適切なXMLパーサーを使用する必要があることに注意してください。

于 2012-10-30T13:07:13.367 に答える
0
grep --perl-regexp --only-matching --regexp="(?<=/watch\\?=)([^&]{0,11})"
于 2012-10-30T13:05:55.397 に答える
0

あなたの行があなたが引用したフォーマットを正確に持っていると仮定すると、これはうまくいくはずです。

awk '{print substr($0,10,11)}'

編集:別の回答のコメントから、あなたの行はこれよりもはるかに長く複雑であると思います。その場合、より包括的なものが必要です。

gawk '{if(match($0, "/watch\\?v=(\\w+)",a)) print a[1]}'
于 2012-10-30T13:08:52.670 に答える