Bash

如何grep已應用RegEx的命令行參數?

  • September 29, 2017

我正在嘗試編寫一個腳本,該腳本將一組表示某些整數的整數作為輸入/dev/sda。例如,如果命令行參數是 3 和 5,則輸出將顯示 和 的/dev/sda3UUID /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 正則表達式風格的文件:

  1. 基本正則表達式
  2. 擴展正則表達式

對於單個數字匹配,您可以將參數字元串直接放入 RE 括號中。(我認為這就是你最初想要做的。)

grep "/dev/sda[$*]:"

請注意,$*將在數字參數之間包含一個空格字元(例如,2並且5將導致$*引用 value 2 5),但我們可以保證/dev/sda :在這種情況下永遠不會匹配它並不重要。

為了簡化命令行,您可以完全省去grep,如下所示:

blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'

引用自:https://unix.stackexchange.com/questions/395149