テキストファイルから日付(年、月、日)と時間(時、分)を抽出し、後で変数として使用する必要があります。宿題ではなく、私の職業に役立つことをしようとするだけです。私は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/')