使用grep,awk,sed等从行中提取子字符串

时间:2012-12-21 00:26:21

标签: bash sed awk grep

我有一些包含许多行的文件:

<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

如何实现这一目标?感谢

4 个答案:

答案 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

更新:检查并修复