bash - SVN 日志 - 仅获取评论中带有模式的修订

标签 bash svn

我正在尝试创建一个简单的 bash 脚本来验证哪些修订版本的注释中不包含特定模式。

例如:

------------------------------------------------------------------------
r272876 | user | 2014-10-30 11:15:06 +0000 (Qui, 30 Out 2014) | 1 line

PATTERN-17278: My comment.
------------------------------------------------------------------------
r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line

My problematic revision
------------------------------------------------------------------------
r273529 | user | 2014-10-20 17:45:36 +0000 (Seg, 20 Nov 2014) | 2 lines

PATTERN-17297: Erro no angulo do vetor velocidade
------------------------------------------------------------------------    
r273797 | user | 2014-10-14 11:35:05 +0000 (Ter, 4 Nov 2014) | 1 line

Other problematic revision
------------------------------------------------------------------------
r274096 | user | 2014-08-26 11:18:31 +0000 (Qua, 5 Nov 2014) | 1 line

And another

如何在列表中轻松打印 r272877、r273797 和 r274096 等修订版本?

最佳答案

首先,让我们定义一个 shell 变量,其中包含 SVN 用于分隔日志条目的虚线:

RS='\n------------------------------------------------------------------------'

现在,我们可以打印所有包含模式的所有日志条目:

svn log . | awk -v "RS=$RS" '!/pattern/{print RS,$0}'

或者,如果您只想要确实包含模式的日志条目,则使用:

svn log . | awk -v "RS=$RS" '/pattern/{print RS,$0}'

它是如何工作的

  • -v "RS=$RS"

    awk 将其输入划分为记录并一次读入一条记录。在这里,我们将记录分隔符定义为 SVN 用于分隔日志条目的分隔符。

  • !/pattern/{print RS,$0}

    awk 隐式循环输入中的每条记录。这将查找包含pattern的记录,其中pattern可以是任何正则表达式。感叹号 ! 表示“不”。打印符合此标准的记录。 print RS,$0 告诉 awk 打印记录分隔符,然后打印该日志条目的内容。

我的 subversion 版本使用 72 个破折号作为记录分隔符。我不知道这是否会因版本而异。如果是,您可能需要适当调整RS的定义。

示例

使用保存在名为 log 的文件中的示例日志输出,这将打印不包含 PATTERN-17278 的所有记录:

$ awk -v "RS=$RS" '!/PATTERN-17278/{print RS,$0}' log

------------------------------------------------------------------------ 
r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line

My problematic revision

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

替代输出:仅返回修订号

修订号是记录分隔符后的第一项。要仅打印修订号,请使用:

svn log . | awk -v "RS=$RS" '!/pattern/{print $1}'

使用示例输入[问题更新之前]作为示例:

$ awk -v "RS=$RS" '!/PATTERN-17278/{print $1}' log2
r2728

使用可变模式

awk -v "RS=$RS" -v p='PATTERN-17278|PATTERN-17297' '$0 !~ p{print $1}' log3
r272877
r273797
r274096

关于bash - SVN 日志 - 仅获取评论中带有模式的修订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742772/

相关文章:

linux - 在 find 中将每个参数传递给 -exec 后的状态

linux - 询问bash脚本的含义

linux - 如何从外部源向 awk 提供值?

linux - 使用父目录和祖父目录重命名文件

svn - 如何识别并可能删除 SVN 存储库中的大二进制提交?

svn - 偶尔svn : E170013: Unable to connect to a repository at URL 'https://svn.....' svn: E730054: Error running context

c++ - 如何处理被认为有更改危险但稳定的代码?

bash - 去工具 vert 。 |& grep -v vendor ;真

C# svnadmin 转储,奇怪的行为

eclipse - 无法使用 Eclipse 3.4.0、svn 1.5.1 创建 subversion 存储库