Bash
如何grep已應用RegEx的命令行參數?
我正在嘗試編寫一個腳本,該腳本將一組表示某些整數的整數作為輸入
/dev/sda
。例如,如果命令行參數是 3 和 5,則輸出將顯示 和 的/dev/sda3
UUID/dev/sda5
。我的程式碼是:#!/bin/bash ### Shows UUID of input /dev's - REQUIRES SUDO ## Options: ## [-m] Multiple Devs - returns both dev name and UUID ## [ ] No option - returns only the UUID of the dev. while getopts m: option do case "${option}" in m) echo -e "\nDEV\tUUID\n====\t================" blkid | grep .*sda[\"$@\"] | sed -r 's/\/dev\/([[:alnum:]]+).* UUID="([[:alnum:]]+)".*/\1\t\2/g' ;; esac done
我的主要問題是
grep .*sda[\"$@\"]
返回以下錯誤的行:$ sudo ./dUShow.sh -m 3 5
DEV UUID ==== ================ grep: Unmatched [ or [^
現在,如果我沒記錯的話,這意味著當我嘗試提供
*.sda[$@]
我希望 RegEx 覆蓋的替代選項時會出現問題*.sda[$1$2]
,相當於給*.sda[35]
定輸入。我該怎麼做呢?
樣本輸入
sudo ./dUShow.sh -m 3 5
期望的輸出
DEV UUID ==== ================ sda3 BC4208CF42089076 sda5 968E185A8E183569
附錄
表達式
.*sda[\"$@\"]
會產生*.sda[35]
or*.sda[3 5]
嗎?如果是後者,會不會有問題?如果是這樣,我該如何解決?
如果 $ 1==3 and $ 2==5 然後
grep .*sda[\"$@\"]
變成
grep .*sda[3 5]
由於缺少引號,這是一個問題。試試這個:
regex=".*sda($( IFS='|'; echo "$*" ))\\>" # => .*sda(3|5)\> blkid | grep -E "$regex" | ...
這
\>
是一個單詞邊界,使正則表達式更精確。一些關於 GNU grep 正則表達式風格的文件:
對於單個數字匹配,您可以將參數字元串直接放入 RE 括號中。(我認為這就是你最初想要做的。)
grep "/dev/sda[$*]:"
請注意,
$*
將在數字參數之間包含一個空格字元(例如,2
並且5
將導致$*
引用 value2 5
),但我們可以保證/dev/sda :
在這種情況下永遠不會匹配它並不重要。為了簡化命令行,您可以完全省去
grep
,如下所示:blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'