regex - 如何在 shell 脚本中使用正则表达式?

标签 regex bash shell

我想将输入字符串(包含在变量 $1 中)与表示日期格式 MM/DD/YYYYMM-DD 的正则表达式匹配-YYYY.

REGEX_DATE="^\d{2}[\/\-]\d{2}[\/\-]\d{4}$"
 
echo "$1" | grep -q $REGEX_DATE
echo $?

无论输入字符串如何,echo $? 都会返回错误代码 1

最佳答案

补充现有的有用答案:

使用 Bash 自己的正则表达式匹配运算符,=~ ,在这种情况下是一个更快的替代方案,因为您只匹配已存储在变量中的单个值:

set -- '12-34-5678' # set $1 to sample value

kREGEX_DATE='^[0-9]{2}[-/][0-9]{2}[-/][0-9]{4}$' # note use of [0-9] to avoid \d
[[ $1 =~ $kREGEX_DATE ]]
echo $? # 0 with the sample value, i.e., a successful match

但是请注意,注意使用特定 flavor 的正则表达式结构,例如 \d同样适用: 同时 =~支持 ERE(扩展 正则表达式),它还支持主机平台的特定扩展 - Bash 的行为与平台相关的情况很少见。

为了保持可移植性(在 Bash 的上下文中),坚持使用 POSIX ERE规范。

请注意 =~甚至允许您定义捕获组(带括号的子表达式),稍后您可以通过 Bash 的特殊 ${BASH_REMATCH[@]} 访问其匹配项数组变量。

补充说明:

  • $kREGEX_DATE使用未加引号,这是识别正则表达式所必需的(带引号的部分将被视为文字)。

  • 虽然并非总是必要,但建议首先将正则表达式存储在一个变量中,因为 Bash 在处理包含 \ 的正则表达式 文字 时遇到麻烦。 .

    • 例如,在 Linux 上,其中 \<支持匹配单词边界,[[ 3 =~ \<3 ]] && echo yes不起作用,但是 re='\<3'; [[ 3 =~ $re ]] && echo yes
  • 我已经更改了变量名 REGEX_DATEkREGEX_DATE ( k 表示一个(概念上的)常量),以确保该名称不是全大写的名称,因为 all-uppercase variable names should be avoided to prevent conflicts with special environment and shell variables .

关于regex - 如何在 shell 脚本中使用正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35919103/

相关文章:

regex - TCL 正则表达式从特定特殊字符中修剪字符串

PHP preg_replace

linux - 这个命令(shell代码)问题有什么解决方案吗

linux - shell 脚本抛出 "No such file or directory"错误,而命令行工作完美

linux - 在 bash 中使用命令行创建用户

linux - 如何删除文件中的换行符而不影响Linux中的实际行尾

F#/.net 中的正则表达式/CTFG

php - 使用正则表达式捕获 html 标签内的内容

linux - 如何使用 grep 打印一行及其匹配模式

Bash 脚本 : Send files to SFTP using Expect