bash 旧版本中的正则表达式模式匹配
Regex pattern matching in old versions of bash
目的:编写客户端git钩子来检查commit-msg是否符合策略。
为此,我编写了一个 bash 脚本,将提交消息的模式与正则表达式相匹配。
它似乎适用于更新版本的 bash
if [[ ! "$START_LINE" =~ $PATTERN ]]; then
但 =~
似乎不适用于旧版本的 bash。
$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys
Copyright (C) 2005 Free Software Foundation, Inc.
PATTERN="^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}[-](AISP|PISP)[-][v][[:digit:]][.][[:digit:]]"
我的队友使用的是旧版本 bash,我不能强迫他们换成新版本。有没有一种方法可以在不使用 =~
运算符的情况下完成模式匹配?
确切错误:
$ git commit -m "dsdsd" .git/hooks/commit-msg: line 5: conditional
binary operator expected .git/hooks/commit-msg: line 5: syntax error
near =~' .git/hooks/commit-msg: line 5: if [[ ! "$START_LINE" =~
$PATTERN ]]; then'
我浏览了互联网上的所有帖子,包括 SO,但他们都建议使用 =~
或转向新版本的 bash。
尝试
if ! echo "$FIRST_LINE" | grep -Eqe "$PATTERN"; then
或(如果您的 shell 支持此处字符串 <<<
)
if ! grep -Eqe "$PATTERN" <<< "$FIRST_LINE"; then
PS: 按照惯例,全大写变量名保留给环境和 shell 变量。使用 $pattern
和 $firstLine
等小写变量以避免意外名称冲突。
PPS: 您的正则表达式可以稍微简化。 [v]
与 v
等同。
^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}-[-][v][[:digit:]][.][[:digit:]]
^[[:alpha:]]{2,6}-[[:digit:]]{0,9}--v[[:digit:]]\.[[:digit:]]
@Socowi 的回答我认为是正确的
您可以用另一种方式写入,如果您习惯于对文件使用 grep 可能会更直观(我通常会弄乱要比较的模式和字符串的顺序),或者至少是正因为如此,我才使用默认值,
if ! grep -Eq "$PATTERN" <(echo "$FIRST_LINE"); then
目的:编写客户端git钩子来检查commit-msg是否符合策略。
为此,我编写了一个 bash 脚本,将提交消息的模式与正则表达式相匹配。
它似乎适用于更新版本的 bash
if [[ ! "$START_LINE" =~ $PATTERN ]]; then
但 =~
似乎不适用于旧版本的 bash。
$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys
Copyright (C) 2005 Free Software Foundation, Inc.
PATTERN="^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}[-](AISP|PISP)[-][v][[:digit:]][.][[:digit:]]"
我的队友使用的是旧版本 bash,我不能强迫他们换成新版本。有没有一种方法可以在不使用 =~
运算符的情况下完成模式匹配?
确切错误:
$ git commit -m "dsdsd" .git/hooks/commit-msg: line 5: conditional
binary operator expected .git/hooks/commit-msg: line 5: syntax error
near =~' .git/hooks/commit-msg: line 5: if [[ ! "$START_LINE" =~
$PATTERN ]]; then'
我浏览了互联网上的所有帖子,包括 SO,但他们都建议使用 =~
或转向新版本的 bash。
尝试
if ! echo "$FIRST_LINE" | grep -Eqe "$PATTERN"; then
或(如果您的 shell 支持此处字符串 <<<
)
if ! grep -Eqe "$PATTERN" <<< "$FIRST_LINE"; then
PS: 按照惯例,全大写变量名保留给环境和 shell 变量。使用 $pattern
和 $firstLine
等小写变量以避免意外名称冲突。
PPS: 您的正则表达式可以稍微简化。 [v]
与 v
等同。
^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}-[-][v][[:digit:]][.][[:digit:]]
^[[:alpha:]]{2,6}-[[:digit:]]{0,9}--v[[:digit:]]\.[[:digit:]]
@Socowi 的回答我认为是正确的
您可以用另一种方式写入,如果您习惯于对文件使用 grep 可能会更直观(我通常会弄乱要比较的模式和字符串的顺序),或者至少是正因为如此,我才使用默认值,
if ! grep -Eq "$PATTERN" <(echo "$FIRST_LINE"); then