使用sed提取指定内容的一种写法

目的:使用linux中的sed命令提取指定内容

假设有字符串:<li><a target="_blank" href="http://www.dbainfo.net">&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;

&#24211;&#24674;&#22797;</a></li>

我想从该字符串中提取出来红色标记的内容,也就是:&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;

linux命令sed和awk都可以实现该需求,本文仅利用sed命令中替换相应正则表达式的方法来实现。

abc="<li><a target=\"_blank\" href=\"http://www.dbainfo.net\">&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;</a></li>"

方法为:

echo $abc| sed 's/\(.*\)href=".*">\(.*\)<\/a>.*/\2/g'

上面sed命令中,正则表达式\(.*\)href=".*">\(.*\)<\/a>.*中第一个红色标记的\(.*\) 因为在href=之前,所以表示源字符串中的<li><a target="_blank" 

第一个\(.*\) 之后的href=".*"> 对应源字符串中的href="http://www.dbainfo.net">  第二个红色标记的\(.*\) 因为在href="http://www.dbainfo.net">之后且</a>的前面,就是我们需要的内容。最后的<\/a>.* 匹配源字符串中的</a></li>

测试结果为:

[root@VPS-CentOS5 ~]# abc="<li><a target=\"_blank\" href=\"href="http://www.dbainfo.net">http://www.dbainfo.net\">&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;</a></li>"

[root@VPS-CentOS5 ~]# echo $abc| sed 's/\(.*\)href=".*">\(.*\)<\/a>.*/\2/g' &#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;

我们发现源字符串中左右尖括号都是成对出现的,可以如法炮制,另外一条命令为:

echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\3/'
中间红色加粗的\(.*\) 对应我们需要的内容。搜索的正则表达式中对应5部分,分别为:

  1. li
  2. a target="_blank" href="http://www.dbainfo.net"
  3. &#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;
  4. /a
  5. /li

第3条正是我们所需要的结果。关于这5部分的输出为:

[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\1/'
li
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\2/'
a target="_blank" href="http://www.dbainfo.net"
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\3/'
&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;&#24211;&#24674;&#22797;
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\4/'
/a
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\5/'
/li
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\6/'
sed: -e expression #1, char 44: invalid reference \6 on `s' command's RHS
-bash: echo: write error: Broken pipe
[root@VPS-CentOS5 ~]# echo $abc | sed 's/<\(.*\)><\(.*\)>\(.*\)<\(.*\)><\(.*\)>/\0/'
<li><a target="_blank" href="http://www.dbainfo.net">&#83;&#121;&#98;&#97;&#115;&#101;&#25968;&#25454;&#24211;&#25216;&#26415;&#44;&#25968;&#25454;

&#24211;&#24674;&#22797;</a></li>

通过以上可以了解关于sed命令中替换字符时所用的正则表达式的一些方法了。

  • 本文链接地址:http://www.sybrepair.com/grep-some-characters-by-linux-sed.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《使用sed提取指定内容的一种写法》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
    1. Linux
      2011-09-06 15:31:15

      呵呵呵,比我专业性更强的博客。完全是代码世界。不过很多值得学习。请问能和博主交换个友链么?

      • dbainfo
        2011-09-06 15:42:58

        可以交换链接。我现在用的sybase数据库的用户群不是很多。有时候也研究一下oracle,mysql等数据库。

    2. Linux
      2011-09-06 15:32:12

      还有,建议博主把段落文章写个溢出换行的样式,不然页面有点错乱!

      • dbainfo
        2011-09-06 15:51:34

        恩,我用的blockquota这个样式好像不会换行。有空研究一下长语句换行,否则页面太难看了。

    3. dbainfo
      2011-09-09 12:05:19
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)