ある変数に対するgrepコマンドの結果を別の変数にインポートする方法

ある変数に対するgrepコマンドの結果を別の変数にインポートする方法

指定された条件に一致するディレクトリのファイルを一覧表示します。ディレクトリ内の各ファイルに対して実行したいことの1つは、6桁の日付を抽出して変数に入れることです。私のスクリプトは現在次のとおりです

for i in $(ls $INPUT_DIR | egrep -i '^'$INPUT_FILE_PREFIX'[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01])'$INPUT_FILE_SUFFIX); do   
 MYDATE=$("$i" | grep -oP '\d{6,6}')
 echo $MYDATE
done

上記の結果はエラーです"somefile": command not found

MYDATE=$("$i" | grep -oP '\d{6,6}')私にとって奇妙なことはecho "$i" | grep -oP '\d{6,6}'

"$i"スクリプトがコマンドの代わりに文字列として渡されるようにするにはどうすればよいですか?

ベストアンサー1

ファイル名から。で$INPUT_FILE_PREFIX始まり、終わる6桁の数字を解析したいようです$INPUT_FILE_SUFFIX

これを行うことができます:

for name in "$INPUT_DIR/$INPUT_FILE_PREFIX"??????"$INPUT_FILE_SUFFIX"; do
    test -f "$name" || continue

    number=${name#$INPUT_DIR/$INPUT_FILE_PREFIX}
    number=${number%$INPUT_FILE_SUFFIX}

    printf "Number = %s\n" "$number"
done

数字のみが一致することを確認するには(該当する文字が何でも単一文字と一致する)、すべて?をに変更します。[0-9]?

ループのパラメータ置換は値の最初の部分を削除し、残りの$name文字列の最後の部分を削除し、中間数字(プレフィックスとサフィックスの間の6文字)のみを変数に残します$number


注文する

MYDATE=$("$i" | grep -oP '\d{6,6}')

見つかったとおり、$i呼び出しコマンドに含まれるすべての内容が解釈されます。また、echo前に置くとうまく"$i"いくと言いました。そしてそれははい:

MYDATE=$(echo "$i" | grep -oP '\d{6,6}')

あなたのコードに関連:なぜ`ls`を解析しないのですか?

おすすめ記事