每行都有一行包含多行的文件 有子串
whatever_blablablalsfjlsdjf;asdfjlds;f/watch?v=yPrg-JN50sw&,whatever_blabla
或
whatever_blablabla"/watch?v=yPrg-JN50sw&" class=whatever_blablablavwhate
我想提取一个子字符串,比如上面的“yPrg-JN50s”
匹配模式是 字符串“/ watch?=”
后面的11个字符如何提取子字符串
我希望它是sed,awk在一行 如果没有,pn行perl脚本也可以
答案 0 :(得分:4)
你可以做到
grep -oP '(?<=/watch\?v=).{11}'
如果您的grep
知道Perl正则表达式,或
sed 's/.*\/watch?v=\(.\{11\}\).*/\1/g'
答案 1 :(得分:3)
$ cat file
/watch?v=yPrg-JN50sw&
"/watch?v=yPrg-JN50sw&" class=
$
$ awk 'match($0,/\/watch\?v=/) { print substr($0,RSTART+RLENGTH,11) }' file
yPrg-JN50sw
yPrg-JN50sw
答案 2 :(得分:2)
只需使用shell的参数扩展,在“watch?v =”之后提取11个字符:
while IFS= read -r line; do
tmp=${line##*watch?v=}
echo ${tmp:0:11}
done < filename
答案 3 :(得分:1)
您可以使用sed删除无关信息:
sed 's/[^=]\+=//; s/&.*$//' file
或者使用awk和敏感字段分隔符:
awk -F '[=&]' '{print $2}' file
file
的内容:
cat <<EOF > file
/watch?v=yPrg-JN50sw&
"/watch?v=yPrg-JN50sw&" 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&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解析器来执行此类任务。
答案 4 :(得分:0)
grep --perl-regexp --only-matching --regexp="(?<=/watch\\?=)([^&]{0,11})"
答案 5 :(得分:0)
假设您的行具有您引用的格式,则应该可以使用。
awk '{print substr($0,10,11)}'
编辑:从另一个答案中的评论中,我猜你的线条比这更长,更复杂,在这种情况下需要更全面的东西:
gawk '{if(match($0, "/watch\\?v=(\\w+)",a)) print a[1]}'