web-dev-qa-db-ja.com

RegExが適用されているコマンドライン引数をgrepする方法は?

特定の/dev/sdaを表す整数のセットを入力として受け取るスクリプトを作成しようとしています。たとえば、コマンドライン引数が3と5の場合、出力には/dev/sda3/dev/sda5のUUIDが表示されます。私のコードは:

#!/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[$@]に相当する*.sda[$1$2]でRegExに上書きさせたい*.sda[35]を代替オプションとして提供しようとしたときに問題が発生することを意味します。

どうすればよいですか?

サンプル入力

Sudo ./dUShow.sh -m 3 5

必要な出力

DEV     UUID
====    ================
sda3    BC4208CF42089076
sda5    968E185A8E183569

補遺

.*sda[\"$@\"]*.sda[35]または*.sda[3 5]を生成しますか?後者の場合、問題は発生しますか?もしそうなら、どうすればそれを解決できますか?

1
Somenath Sinha

$ 1 == 3および$ 2 == 5の場合、

grep .*sda[\"$@\"]

に変わる

grep .*sda[3 5]

これは引用符がないために問題になります。代わりにこれを試してください:

regex=".*sda($( IFS='|'; echo "$*" ))\\>"     # => .*sda(3|5)\>
blkid | grep -E "$regex" | ...

\>は、正規表現をより正確にするための単語境界です。


GNU grep正規表現フレーバーに関するいくつかのドキュメント:

  1. 基本的な正規表現
  2. 拡張正規表現
2
glenn jackman

1桁の一致の場合、引数文字列をREブラケットに直接入れることができます。 (これはあなたが最初にやろうとしていたことだと思います。)

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

$*には、数字の引数の間にスペース文字が含まれます(たとえば、25の結果、$*の引用値は2 5になります)。 /dev/sda :が決して一致しないことを保証できるので、この状況では問題ではありません。

コマンドラインを簡略化するために、次のようにgrepを完全に省略できます。

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