0

我正在尝试创建一个脚本,该脚本会自动查找插入的设备并对其进行压缩备份。但是,我无法找到正确的使用方法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上起草了正则表达式(链接中共享的正则表达式),并使用了什么mount转储 (gist)

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

0

我环顾四周,发现了这个 SO question。它对我没有太大帮助,因为现在它暗示expr不识别我用来捕获设备的括号,并且它还认为表达式没有捕获任何东西!

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

4

1 回答 1

1

需要注意的几点expr

  1. 正则表达式隐式锚定在字符串的开头(就像您使用 开始表达式一样^)。
  2. 捕获组用转义括号表示,\(...\)
  3. 仅支持基本的正则表达式。具体来说,\s不支持\S、 和。+?

以下将匹配一个设备。

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

请注意,您不需要使用exprwith bash,它内置了正则表达式匹配。

regex='/dev/(sd[^a])[[:digit:]] on '
mount | while IFS= read -r line; do
    [[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]}
done
于 2016-03-02T02:23:09.150 回答