在定义的模式之后提取随机长度的字符串

时间:2014-07-15 10:18:45

标签: regex grep

以下是我想从中提取信息的文字:

  <ul class="disc">
            <li><strong>euro195.com</strong></li>
            <li><strong>euro213.com</strong></li>
            <li><strong>uk180.com</strong> <span class="red">(optimized for web surfing; no p2p downloading)</span></li>
            <li><strong>us1.com</strong> <span class="red">(optimized for web surfing; no p2p downloading)</span></li>
            <li><strong>us2.com</strong> <span class="red">(optimized for web surfing; no p2p downloading)</span></li>
            <li>Username:   <strong>user1</strong></li>
            <li>Password:   <strong>pswd1</strong></li>
        </ul>

        <div><strong><span class="green"> More servers coming.</span></strong></div>

    </div><!-- .columns -->

在此文本中,应使用以下两种方式获取用户名和密码:

1

用户名:USER1

PSWD:pswd1

2

用户1

pswd1

=====

1。 我只能拥有

<li>Username:   <strong>user1</strong></li>
  <li>Password:   <strong>pswd1</strong></li>

以下

egrep 'Username|Password' file

或者

<li>Username:   <strong>user1

<li>Password:   <strong>pswd1

以下

grep -oP 'Username:.{0,16}|Password:.{0,16}' file

但这意味着信息长度始终相同而不是这种情况。

2。 这是我试过的,再次徒劳无功:

grep -oP "(?<=(Username: \<strong\>|Password: \<strong\>))[^>]*\<" text4 

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

使用html解析器而不是grep会更好。

$ grep -oP "(?<=(Username:   <strong>|Password:   <strong>))[^<]*" file
user1
pswd1

您需要在lookbehind中添加确切的空格,否则它将无法工作,并且不需要逃避<>

答案 1 :(得分:1)

不确定grep是否合适,但你可以使用

cat text4 | egrep '(Username:|Password:)' | sed 's/^.*<strong>\(.*\)<\/strong>.*$/\1/'