使用SED,AWK或PERL从行中提取11个字符的子字符串



我在每行中都有一个带有许多行的文件有substring

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

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

我想提取一个子字符串,例如上面的" yprg-jn50"

匹配模式是字符串"/watch?="

之后的11个字符

如何提取子字符串

我希望它是sed,一行尴尬如果没有,PN行Perl脚本也可以

你可以做

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

如果您的grep知道Perl Regex或

sed 's/.*/watch?v=(.{11}).*/1/g'
$ 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

仅在外壳的参数扩展中,提取11个字符,"观看?v =":

while IFS= read -r line; do
    tmp=${line##*watch?v=}
    echo ${tmp:0:11}
done < filename

您可以使用sed删除无关信息:

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

或带有尴尬和明智的场分离器:

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 -v RS='[=&"]' '/watch/ { getline; print }' file

注意,您应该对这种任务使用适当的XML解析器。

grep --perl-regexp --only-matching --regexp="(?<=/watch\?=)([^&]{0,11})"

假设您的行具有您引用的格式,这应该有效。

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

编辑:从另一个答案中的评论中,我想您的行比这更长且复杂,在这种情况下,需要更全面的东西:

gawk '{if(match($0, "/watch\?v=(\w+)",a)) print a[1]}'

最新更新