expr bash 命令在子字符串评估中返回 0

expr bash 命令在子字符串评估中返回 0

我试图从文件中读取一行,将其存储在变量中$line并提取所有实例<UPPERCASE>(即,尖括号之间只有大写字母)。我正在尝试的是:

while read line
do
#some other commands
FOUND=`expr $line : \<[A-Z]*\>`
echo FOUND is:$FOUND
#more commands

当我运行脚本时我给它提供:

<hello><HELLO>

输出:

FOUND is:0

我也尝试过在正则表达式位周围使用引号的变化。即 "\<[A-Z]*\>"'\<[A-Z]*\>' 以及 \(<[A-Z]*>\)最后一个返回 null。

我查看了手册页,如果匹配到零个字符或匹配失败,它应该返回 0。我觉得这是我忽略的一个很小的问题,但搜索了一个小时后,我还是没能搞清楚。

任何帮助表示感谢

答案1

检查expr手册页:正则表达式是隐含锚定,所以如果你的 $line 没有开始如果尖括号中有一个大写单词,expr 将找不到它

line="<hello><HELLO>"
expr "$line" : '.*<[[:upper:]]*>'       # => 14
expr "$line" : '.*\(<[[:upper:]]*>\)'   # => <HELLO>

參考文獻:https://www.gnu.org/software/coreutils/manual/html_node/String-expressions.html

请注意,这expr不是 bash 命令,而是一个单独的程序。如果您想在 bash 中执行此操作:

if [[ "$line" =~ "<"[[:upper:]]*">" ]]; then
    echo "found it"
    echo "${BASH_REMATCH[0]}"
fi

还,引用你的变量

相关内容