2017-01-04 14 views
1

bashの新機能です。bashスクリプトの文字列からパターンを抽出します。

私はこの問題を解決するために、パラメータの拡張、grep、sed、echoを実験しましたが、それをうまく解決することはできません。

私は、$ PWDから特定のパターンをbashスクリプトで抽出しようとしています。

さんは、フルパスの様々ながあるかもしれないとしましょう:すべてのインスタンスで

/home/files/tmp8 
/home/tmp28/essential 
/home/tmp2/essential/log 
/home/files/tmp10/executables 
/tmp8/files/whatever/etc 

、Iは1つの以上の整数に続いて「TMP」を含む任意の文字列を抽出したいです。

だから、$ PWDが処理される各インスタンスでは、それは

の説明のために、「tmp8」、「tmp28」など「TMP2」を返しますどのようにこの問題を解決する点で機能/オペレーターの仕事大変に感謝しています。

答えて

1

使用grep -oは0以上の数字が続く正規表現tmp[0-9]*すなわちリテラルテキストtmpを使用してのみマッチしたテキストを表示するには:あなたは任意のパス文字列からパターンを抽出するために、bashで正規表現を使用することができます

grep -o 'tmp[0-9]*' file 
tmp8 
tmp28 
tmp2 
tmp10 
tmp8 
+0

両方の説明をいただきありがとうございます。これらを使用して、抽出されたパターンを文字列に割り当てたり、別のコマンドで使用することはできますか? –

+1

確かに、 'str = $(grep -o 'tmp [0-9] *' <<<" $ PWD ")'を実行して、抽出されたパターンを変数 'str'に割り当てることができます – anubhava

+1

' grep -o 'tmp [ 0-9] * '<<< "$ PWD"は一致した文字列、つまり完全入力ではない 'tmp 'のみを返します。 – anubhava

3

。次の例を参照してください。

if [[ "$PWD" =~ ^.*(tmp[0-9]+).*$ ]] 
then 
    printf "match: ${BASH_REMATCH[1]}\n" 
else 
    printf "no match: $PWD\n" 
fi 

正規表現は、丸括弧でグループを定義します。 式が一致するグループ(次の少なくとも1桁の数字を含むtmp)と一致する場合は、Bashによって配列BASH_REMATCHに格納されます。

関連する問題