expr:正则表达式未检测到有效表达式

时间:2016-03-02 00:52:57

标签: regex bash expr

我正在尝试创建一个脚本,该脚本会自动查找插入的设备并对其进行压缩备份。但是,我无法找到使用expr的正确方法:

#!/bin/bash

MountText=`mount`
# Show result of regex search
expr "$MountText" : '\/dev\/(sd[^a])\d on [\S]+\/[\s\S]+? type'

表达式本身为\/dev\/(sd[^a])\d on [\S]+\/[\s\S]+? type,并捕获设备名称(sd *),同时排除与sda相关的挂载。

我在Regexr(链接中使用正则表达式),and used what mount dumped (gist)起草了正则表达式。

出于某种原因,它只会给出这个奇怪的错误:

0

我环顾四周,我found this SO question。它并没有给我太多帮助,因为现在它暗示expr没有识别我用来捕捉设备的括号,而且它也认为表达没有&#39捕获任何东西!

我真的很困惑。我做错了什么?

1 个答案:

答案 0 :(得分:1)

expr要注意的一些事项:

  1. 正则表达式隐式锚定在字符串的开头(就像您使用^启动表达式一样)。
  2. 捕获组用转义括号\(...\)表示。
  3. 仅支持基本正则表达式。具体而言,不支持\s\S+?
  4. 以下内容将匹配 one 设备。

    expr "$MountText" : '.*/dev/\(sd[^a]\)[[:digit:]] on '
    

    请注意,您不需要将exprbash一起使用,regex='/dev/(sd[^a])[[:digit:]] on ' mount | while IFS= read -r line; do [[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]} done 内置了正则表达式匹配。

    ^[><]\d+$