2016-03-02 110 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

這可行!我不相信我需要找到其他設備,但是如果我需要,我想我可以使用字符串操作來刪除捕獲的行。非常感謝! –