【问题标题】:svn log retrieve between the lines where find specific wordsvn log 在找到特定单词的行之间检索
【发布时间】:2012-02-24 22:12:02
【问题描述】:

我想从 SVN 日志中提取行间的所有文本。如果使用 sed、awk 或 grep 会更好。

示例:svn.log

------------------------------------------------------------------------
r1075 | popad | 2011-12-02 14:28:20 +0200 (Fri, 02 Dec 2011) | 1 line
Changed paths:
   M /trunk/apps/frontend/modules/mail/templates/candidateSearchAgentSuccess.php
   M /trunk/apps/test.php

Ticket #1000: removing ads from emails
------------------------------------------------------------------------
r1074 | coman | 2011-11-30 10:51:29 +0200 (Wed, 30 Nov 2011) | 3 lines
Changed paths:
M /trunk/apps/frontend/i18n/messages.de.xml
M /trunk/apps/frontend/i18n/messages.en.xml
M /trunk/apps/frontend/i18n/messages.ro.xml

Ticket #1089: translation update: send to friend form
http://example.com/projects/147/tickets/1089
Solved HU translation update


------------------------------------------------------------------------

我想搜索 Ticket #1000 并检索行间的整个块

------------------------------------------------------------------------
r1075 | popad | 2011-12-02 14:28:20 +0200 (Fri, 02 Dec 2011) | 1 line
Changed paths:
   M /trunk/apps/frontend/saSuccess.php
   M /trunk/apps/frontend/saAddSuccess.php

Ticket #1000: removing ads from emails
------------------------------------------------------------------------

提前致谢。

【问题讨论】:

    标签: svn sed awk grep


    【解决方案1】:

    我建议使用 svn log 的 xml 输出并从 xml 文件中提取信息。可能更简单...

    svn log --xml ...
    

    【讨论】:

      【解决方案2】:

      有趣的练习,所以我去试试!

      % awk ' 
      {
          lines = lines "\n" $0
      }
      
      /Ticket #1000/ {
          found = 1
      }
      
      /^-+$/ {
          if (found) {
              print lines
          }
          lines = $0
          found = 0
      }
      ' svn.log
      ------------------------------------------------------------------------
      r1075 | popad | 2011-12-02 14:28:20 +0200 (Fri, 02 Dec 2011) | 1 line
      Changed paths:
         M /trunk/apps/frontend/modules/mail/templates/candidateSearchAgentSuccess.php
         M /trunk/apps/test.php
      
      Ticket #1000: removing ads from emails
      ------------------------------------------------------------------------
      

      我认为这是不言自明的,但如果不是,我会更新答案。

      即使有多个提交包含搜索字符串,这也有效。

      让搜索字符串变量留作练习。

      测试使用:

      % awk --version
      awk version 20070501
      

      我更喜欢避免单行。如果你喜欢那种东西,那么你需要在语句之间使用分号。

      【讨论】:

      • 所有参数不在同一行是有原因的。它给了我语法错误。
      • 优秀。效果很好:awk v3.1.6。
      【解决方案3】:

      这个 awk oneliner 为您提供所需的输出:

      awk -vRS='-+\n' '/Ticket #1000/' svn.log
      

      测试

      kent$  awk -vRS='-+\n' '/Ticket #1000/' svn.log 
      
      r1075 | popad | 2011-12-02 14:28:20 +0200 (Fri, 02 Dec 2011) | 1 line
      Changed paths:
         M /trunk/apps/frontend/modules/mail/templates/candidateSearchAgentSuccess.php
         M /trunk/apps/test.php
      
      Ticket #1000: removing ads from emails
      

      您已经看到行分隔符 (-----) 不在输出中。如果你真的需要,它可以很容易地添加。

      【讨论】:

      • +1 来自我。这显然是最简洁和最容易理解的方法。不过,我的会打印行分隔符;)
      • @danielpopa:“谢谢。这很有帮助!”最好表达“by clicking on the check box outline to the left of the answer.
      • 你可以看到我的得分,我是一个初学者。因此,您也可以通过单击我的问题上的左上箭头来帮助我;)
      • @danielpopa:如果您将鼠标悬停在那个小箭头上,您会看到它显示“这个问题显示了研究工作”。恐怕我不能点击它。
      【解决方案4】:

      这可能对你有用:

       sed '/^-\+$/{h;:a;$d;N;/-\+$/!ba;/Ticket #1000:/p;g;ba};d' svn.log
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多