0

プラグインされたデバイスを自動的に検索し、その圧縮バックアップを作成するスクリプトを作成しようとしています。ただし、使用方法の正しい方法を見つけるのに問題があります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で正規表現を起草し(regex はリンクで共有されています)、ダンプされたもの (gist) を使用しましたmount

何らかの理由で、この奇妙なエラーのみが発生します。

0

周りを見回したところ、この SO question が見つかりましたexprデバイスをキャプチャするために使用した括弧が認識されなかったことを意味しているため、あまり役に立ちませんでした。

私は本当に混乱しています。私は何を間違っていますか?

4

1 に答える 1

1

注意すべき点がいくつかありexprます。

  1. 正規表現は、文字列の先頭に暗黙的に固定されます (式を で始めたかのように^)。
  2. キャプチャ グループは、エスケープされた括弧で示されます\(...\)
  3. 基本的な正規表現のみがサポートされています。具体的には\s、 、\S、および+?はサポートされていません。

以下は1つのデバイスに一致します。

expr "$MountText" : '.*/dev/\(sd[^a]\)[[:digit:]] on '

正規表現マッチングが組み込まれているexprwithを使用する必要がないことに注意してください。bash

regex='/dev/(sd[^a])[[:digit:]] on '
mount | while IFS= read -r line; do
    [[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]}
done
于 2016-03-02T02:23:09.150 に答える