狐狸.fox 2011-02-22 16:34 采纳率: 0%
浏览 259
已采纳

如何使用 GREP、 REGEX 或 PERL 提取模式下的字符串

I have a file that looks something like this:

<table name="content_analyzer" primary-key="id">
  <type="global" />
</table>
<table name="content_analyzer2" primary-key="id">
  <type="global" />
</table>
<table name="content_analyzer_items" primary-key="id">
  <type="global" />
</table>

I need to extract anything within the quotes that follow "name=", i.e., content_analyzer , content_analyzer2 and content_analyzer_items.

I am doing this on a Linux box, so a solution using sed, perl, grep or bash is fine.

转载于:https://stackoverflow.com/questions/5080988/how-to-extract-string-following-a-pattern-with-grep-regex-or-perl

  • 写回答

8条回答 默认 最新

  • 程序go 2011-02-22 17:21
    关注

    Since you need to match content without including it in the result (must match name=" but it's not part of the desired result) some form of zero-width matching or group capturing is required. This can be done easily with the following tools:

    Perl

    With Perl you could use the n option to loop line by line and print the content of a capturing group if it matches:

    perl -ne 'print "$1\n" if /name="(.*?)"/' filename
    

    GNU grep

    If you have an improved version of grep, such as GNU grep, you may have the -P option available. This option will enable Perl-like regex, allowing you to use \K which is a shorthand lookbehind. It will reset the match position, so anything before it is zero-width.

    grep -Po 'name="\K.*?(?=")' filename
    

    The o option makes grep print only the matched text, instead of the whole line.

    Vim - Text Editor

    Another way is to use a text editor directly. With Vim, one of the various ways of accomplishing this would be to delete lines without name= and then extract the content from the resulting lines:

    :v/name=/d
    :%s/\v.*name\="([^"]+)".*/\1
    

    Standard grep

    If you don't have access to these tools, for some reason, something similar could be achieved with standard grep. However, without the look around it will require some cleanup later:

    grep -o 'name="[^"]*"' filename
    

    A note about saving results

    In all of the commands above the results will be sent to stdout. It's important to remember that you can always save them by piping it to a file by appending:

    > result
    

    to the end of the command.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示