【问题标题】:grep for multiple strings in a single linegrep 用于单行中的多个字符串
【发布时间】:2013-03-02 12:49:16
【问题描述】:

我需要检查提交日志消息中是否有任何字符串“已添加/已更改/已修复/已删除”。我正在编写一个 svn 预提交钩子,预期的提交注释应该在消息中包含这 4 个字符串之一。

我使用的代码如下

REPOS=$1
TXN=$2

SVN="/usr/bin/svn";
SVNLOOK="/usr/bin/svnlook";

$SVNLOOK log "$REPOS" -t "$TXN" | \
grep "[a-zA-Z0-9]" > /dev/null

GREP_STATUS=$?
if [ $GREP_STATUS -ne 0 ]
then
  "${ECHO}" "No Log comments present" >> "${LOG}"
   echo "Your commit has been blocked because you didn't give any log message" 1>&2
   echo "Please write a log message describing the purpose of your changes and" 1>&2
   echo "then try committing again. -- Thank you" 1>&2
exit 1
fi

在上面的代码中,

$SVNLOOK log "$REPOS" -t "$TXN"

会给我用户输入的提交信息。现在我必须检查消息中是否存在任何字符串“Added、Changed、Fixed、Deleted”。 也就是说,

if (any of the above 4 strings are not present),
 exit 1

我试过了

$($SVNLOOK log -t "$TXN" "$REPOS" | grep -q "Added\|Changed\|Fixed\|Deleted"|)

但它似乎没有工作。

【问题讨论】:

  • “似乎没有工作”不是一个非常有用的诊断,请提供一个显示问题的最小示例。

标签: shell unix grep pre-commit-hook


【解决方案1】:

删除反斜杠并使用egrep 我还推荐-i 进行不区分大小写的匹配:

egrep -q -i "added|changed|fixed|deleted"

【讨论】:

  • -e != -E 并且进行不区分大小写的匹配可能会产生误报。
  • 在我的 RHEL 机器上,-q(“安静”标志)抑制了egrep 的输出,所以什么都不会打印...
  • 是的,@Kevin,这就是 OP 试图用 3 行来做的事情(grep 到 /dev/null,在 GREP_STATUS 中保存 $?,然后在 if 中使用它)。他可以直接在if中使用上面的命令。
【解决方案2】:

要使用交替,您需要Extended Regexp:

grep -qE 'Added|Changed|Fixed|Deleted'

或者:

egrep -q 'Added|Changed|Fixed|Deleted'

【讨论】:

  • 在我的 RHEL 机器上,-q 选项会抑制命令的正常输出,因此应该省略此选项。
【解决方案3】:

像这样使用grep -e 选项(多次):

grep -e Added -e Changed -e Fixed -e Deleted

否则转到正则表达式路线:

grep --regexp=Added|Changed|Fixed|Deleted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2017-01-08
    • 2023-03-09
    • 2013-04-19
    相关资源
    最近更新 更多