我有一些包含许多行的文件:
<a href="http://www.youtube.com/user/airuike" class="yt-uix-sessionlink yt-user-name " data-sessionlink="ei=CKPW6LXqqbQCFSqVIQod_BwsaQ%3D%3D" dir="ltr">lily weisy</a>
我想提取www.youtube.com/user/airuike和lily weisy,然后我还要将airuike从www.youtube.com/user/中分离出来
所以我想获得3个字符串:www.youtube.com/user/airuike,airuike和lily weisy
如何实现这一目标?感谢
答案 0 :(得分:3)
这样做:
sed -e 's/.*href="\([^"]*\)".*>\([^<]*\)<.*/link:\1 name:\2/' < data
会给你第一部分。但是在此之后我不确定你在做什么。
答案 1 :(得分:1)
因为它是html,并且html应该用html解析器而不是grep / sed / awk解析,你可以使用我的Xidel的模式匹配函数。
xidel yourfile.html -e '<a class="yt-uix-sessionlink yt-user-name " dir="ltr">{$link := @href, $user := substring-after($link, "www.youtube.com/user/"), $name:=text()}</a>*'
或者,如果你想要一个类似CSV的结果:
xidel yourfile.html -e '<a class="yt-uix-sessionlink yt-user-name " dir="ltr">{string-join((@href, substring-after(@href, "www.youtube.com/user/"), text()), ", ")}</a>*' --hide-variable-names
有点难过,你也想拥有airuike字符串,否则它可能就像
一样简单xidel /yourfile.html -e '<a href="{$link}" class="yt-uix-sessionlink yt-user-name ">{$name}</a>*'
(你原本应该可以使用xidel '<a href="{$link:=., $user := filter($link, www.youtube.com/user/(.*)\', 1)}" class="yt-uix-sessionlink yt-user-name " dir="ltr">{$name}</a>*'
,但似乎我没有想到语法。只是一个错误检查,它打破了一切。)< / p>
答案 2 :(得分:1)
$ awk '{split($0,a,/(["<>]|:\/\/)/); u=a[4]; sub(/.*\//,"",a[4]); print u,a[4],a[12]}' file
www.youtube.com/user/airuike airuike lily weisy
答案 3 :(得分:0)
我认为这样的事情必须有效
while read line
do
href=$(echo $line | grep -o 'http[^"]*')
user=$(echo $href | grep -o '[^/]*$')
text=$(echo $line | grep -o '[^>]*<\/a>$' | grep -o '^[^<]*')
echo href: $href
echo user: $user
echo text: $text
done < yourfile
正则表达式基础知识:http://en.wikipedia.org/wiki/Regular_expression#POSIX_Basic_Regular_Expressions
更新:检查并修复