2016-03-02 112 views
0

我试图创建一个脚本,它自动查找插入设备并对其进行压缩备份。不过,我无法找到如何使用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不能识别我用来捕捉设备的括号,并且它也相信这个表达式不会捕获任何东西!

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

+1

正则表达式只有语言中工作,外壳使用通配符或水珠,请谷歌这些条款为您正在使用的外壳,** echo $ SHELL ** –

+0

谢谢,没有听到任何'expr'使用globs的信息。虽然,我不明白你的意思** echo $ SHELL **,因为我在标签和hashbang中都提到了我使用的是bash。 –

+0

@ArifBurhan另外,我检查了'man'页面,它说'expr STRING:REGEXP'使用正则表达式。 –

回答

1

有几件事情与expr注意:

  1. 正则表达式在字符串的开头被隐式锚定(因为如果你用^开始表达)。
  2. 捕获组用带括号的圆括号\(...\)表示。
  3. 只支持基本的正则表达式。具体而言,不支持\s\S+?

以下将匹配一个设备。

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 
+0

这给出了与以前相同的错误,所以虽然其中一些可能对我有帮助,但它仍然无效。你有没有按照我的要求对它进行测试? –

+0

对不起,试图从记忆中做太多。更新,但有一个警告:您只能捕获匹配的第一个设备,而不是更多。 (不支持非贪婪的'+?'操作符,但不管怎么说都是不必要的。) – chepner

+0

这可行!我不相信我需要找到其他设备,但是如果我需要,我想我可以使用字符串操作来删除捕获的行。非常感谢! –