在单行中搜索多个字符串的grep命令

5

我需要检查提交日志信息中是否包含“Added/Changed/Fixed/Deleted”字符串之一。我正在编写一个svn precommit钩子,期望的提交注释应该在消息中包含这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"|)

但是它似乎没有起作用。


1
“不起作用”并不是一个非常有用的诊断信息,请提供一个最小化的示例来展示问题。 - Thor
3个回答

11

使用grep -e选项(多次)如下:

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

否则,进入正则表达式路线:
grep --regexp=Added|Changed|Fixed|Deleted

6
要使用替换功能,你需要使用 扩展正则表达式
grep -qE 'Added|Changed|Fixed|Deleted'

或者:

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

在我的 RHEL 机器上,-q 选项抑制了命令的正常输出,因此应省略此选项。 - Kevin

4

去掉反斜杠并使用egrep,我还建议使用-i进行不区分大小写的匹配:

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

1
-e 不等于 -E,进行不区分大小写的匹配可能会产生误报。 - Chris Seymour
在我的 RHEL 机器上,"-q"(即“安静”标志)抑制了 egrep 的输出,因此没有任何内容被打印出来... - Kevin
是的,@Kevin,这就是原帖尝试用三行代码实现的功能(grep 到 /dev/null,将 $? 保存在 GREP_STATUS 中,然后在 if 中使用它)。他可以直接在 if 中使用上述命令。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接