ファイル名から日付を取得する必要があります。

ファイル名から日付を取得する必要があります。

ファイル名はabcd_abcd_12302022.csvで、次のコマンドを使用してファイル名から日付を抽出しました。

cut -c 11-18

日付は 12302022 です。 2022年12月30日に次のコマンドを実行しようとしましたが、12_30_2022を取得しました。

echo '20150716' | sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/'

2022年12月30日の出力が必要です。

答え1

これはあなたのような基本的な考えです。そこに直接追加したので、_変更すると/機能します。 sedの演算子には別の区切り文字を使用する必要がありますs///。ここでは以下を使用していますs|||

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed -E 's|(..)(..)(....)|\1/\2/\3|'
12/30/2022

または、携帯性を向上させるには:

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed  's|\(..\)\(..\)\(....\)|\1/\2/\3|'
12/30/2022

またはを使用できますが、次のように挿入する内容をエスケープする必要がs///あります。/\/

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed -E 's/(..)(..)(....)/\1\/\2\/\3/'
12/30/2022

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed  's/\(..\)\(..\)\(....\)/\1\/\2\/\3/'
12/30/2022

答え2

Bashシェルの変数にファイル名がある場合は、andを使用する代わりに、次のコマンドを使用してシェルから直接目的の形式を取得できますcutsedシェルパラメータ拡張:

file=abcd_abcd_12302022.csv
printf '%s\n' "${f:10:2}/${f:12:2}/${f:14:4}"

これはインタラクティブな使用やワンタイムイベントには重要ではありませんが、多くのファイルからタイムスタンプを抽出したい場合は、コメントを保存して時間を節約cutできます。sed

関連情報