txtファイルから日付と時刻をgrepして新しい変数を取得します。

txtファイルから日付と時刻をgrepして新しい変数を取得します。

テキストファイルから日付(年、月、日)と時間(時、分)を抽出し、後で変数として使用する必要があります。宿題ではなく、私の職業に役立つことをしようとするだけです。私はLinuxに初めて触れました。

入力:次の名前のファイルのリストを含むテキストファイル:

S3G_MX_1_EFR____20100203T121015_othernumbers.zip

希望の出力は次のとおりです。

2010 02 03 12 10

年、月、日、時、分など、さまざまな変数に個別に入れたいです。 grepを使うべきですか?それともsed?それとも?たくさん読んでください。しかし、可能性が多すぎてストレスを受けます。S3G_MX_1_EFR____「年」という文字列の後に「数字4つ」のような表現を書くことはできますか?完全なコードは必要なく、使用するオプション/コマンドまたは開始位置に関するいくつかの提案が必要です。

答え1

GNU grepとbashの使用:

filename="S3G_MX_1_EFR____20100203T121015_othernumbers.zip"
timestamp=$( echo "$filename" | grep -oP '(?<=\D)\d{8}T\d{4}' )

それから

year=${timestamp:0:4};    echo $year      # => 2010
month=${timestamp:4:2};   echo $month     # => 02
day=${timestamp:6:2};     echo $day       # => 03
hour=${timestamp:9:2};    echo $hour      # => 12
minute=${timestamp:11:2}; echo $minute    # => 10

実際には通常のbashが可能です(バージョン4+が必要です)。

regex='_([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})'
if [[ $filename =~ $regex ]]; then
    year=${BASH_REMATCH[1]}
    month=${BASH_REMATCH[2]}
    day=${BASH_REMATCH[3]}
    hour=${BASH_REMATCH[4]}
    minute=${BASH_REMATCH[5]}
    echo "$year $month $day $hour $minute"
fi
2010 02 03 12 10

答え2

交換してみてはいかがでしょうか?

sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/'

(拡張正規表現構文)などのパターンは、(....)パターンの後の4桁の数字と一致し、\1置換にはasと次のものを使用できます。したがって、あなたの例の結果は次のとおりです。

export year=2010 month=02 day=03 hour=12 minute=10

この行は次のように実行できます

$(echo S3G_MX_1_EFR____20100203T121015_othernumbers.zip | sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/')

関連情報