0

私は正規表現に非常に慣れていないので、これは答えるのが非常に簡単な質問であり、すでに何度か尋ねられているに違いないと思いますが、残念ながらそれらの答えは見つかりません。

ディレクトリを指定すると、名前がパターン「nw = [number] .a = [number]」を尊重するすべてのサブディレクトリのリストが必要です。すべてのディレクトリについて、それらの番号を取得し、それらに基づいていくつかのことを行う必要があります。 。これらのディレクトリのいくつかは、nw = 82.a = 40、nw = 100.a = 9、eccです。

これを達成するための私の推測は

#! /bin/bash

cd $mydir
for dir in `ls | grep nw=[:digit:]+.a=[:digit:]`: do
    retrieve the numbers
    a few things
done

なぜそれが機能しないのですか、そしてどうすれば番号を取得できますか?

よろしくお願いします、フェルディナンド

4

3 に答える 3

3

grepコマンドのいくつかの修正:

grep -E 'nw=[[:digit:]]+\.a=[[:digit:]]+'
  1. 「-E」フラグを使用すると、たとえば「+」演算子を含む拡張正規表現を使用できます。
  2. 二重角かっこを使用する
  3. ピリオドをエスケープします。エスケープしない場合は、任意の文字に一致する演算子として使用されます
  4. 最後の「+」が最後から欠落しています。grepはより一般的なケースに一致するため、完全に必要というわけではありませんが、おそらくパス名の方が適切です。
  5. 正規表現を引用符の間に配置することをお勧めします(この場合、一重引用符で十分です)

これがお役に立てば幸いです=)

于 2012-10-02T13:53:49.537 に答える
2
perl -e '@a=`ls`;m/nw=(\d+)\.a=(\d+)(?{print"$1\t$2\n"})/ for@a'

楽しみ。

端末のlsコマンドを呼び出し、リストを配列@aに格納します。

@a=`ls`;

一致するものを探しています

m/

nw =($ 1でキャプチャした数字).a =($ 2でキャプチャした数字)

nw=(\d+)\.a=(\d+)

パターン内からコードの評価を開始する

(?{

最初の数字、タブ、2番目の数字、改行を印刷します

print"$1\t$2\n"})

マッチングパターングループの終了

/

配列@aの各ファイル名(改行はまだ追加されている)に埋め込まれたコードを使用して、この一致の試行を実行します

for@a

はい、それは不可解でした。

于 2012-10-02T14:03:45.810 に答える
1

解析しないでくださいlsfind代わりに使用してください:

find . -maxdepth 1 -type d -regex '.*nw=[0-9]+\.a=[0-9]+.*' | while IFS= read -r dir
do
    echo "Found directory: $dir"
    if [[ "$dir" =~ nw=([0-9]+)\.a=([0-9]+) ]]
    then
        echo "numbers are ${BASH_REMATCH[1]} and ${BASH_REMATCH[2]}"
    fi
done
于 2012-10-02T16:15:12.363 に答える