web-dev-qa-db-ja.com

新しい変数のtxtファイルからのgrepの日付と時刻

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

入力:テキストファイルには、次のような名前のファイルのリストが含まれています。

S3G_MX_1_EFR____20100203T121015_othernumbers.Zip

必要な出力は次のとおりです。

2010 02 03 12 10

それらをいくつかの変数(年、月、日、時間、分)に分けて入れたいと思います。 grepを使用する必要がありますか?またはsed?またはawk?たくさん読んだのですが、可能性の量にストレスを感じています。 「文字列S3G_MX_1_EFR____が「年」の後に4つの数字」のような式を書くことは可能ですか?完全なコードは必要ありません。使用するオプション/コマンドや開始場所について少しアドバイスが必要です。

1
I V

GNU grep and 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
1
glenn jackman

次のような交換はどうですか

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

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

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/')
0
Philippos