
入力する:
日 1 2018年7月9日 22:40:57 2019年1月20日 11:48:52
日 2 2018年11月28日 19:23:49 2019年1月20日 05:29:49
予想出力:
日 1 2018/09/07 22:40:57 2019/20/01 11:48:52
日 2 2018/28/11 19:23:49 2019/20/01 05:29:49
次のテキストの変更日/月/年到着年月日、つまり代替テキストです。
答え1
長すぎます。
$ echo -e "Job1 07/09/2018 22:40:57 01/20/2019 11:48:52\nJob2 11/28/2018 19:23:49 01/20/2019 05:29:49" | sed 's/\([0-9]\+\)\/\([0-9]\+\)\/\([0-9]\{4\}\)/\3\/\2\/\1/g' -
Job1 2018/09/07 22:40:57 2019/20/01 11:48:52
Job2 2018/28/11 19:23:49 2019/20/01 05:29:49
sed
コマンドの説明:
's/pattern/replacement/'
これが基本構文です
g
最後にaを追加すると(たとえば's/pattern/replacement/g'
)、1行に複数回置き換えられます。
[0-9]
任意の数字と一致します。
[0-9]*
0個以上の数字と一致します。
[0-9]\+
1つ以上の数字と一致します(注:バックスラッシュはエスケープ文字です。この場合は代わりに解釈されるため、エスケープする必要があります。\
他の場合/使用では正しくエスケープする必要はありません)。+
bash
sed
\/
再スラッシュ/
;でエスケープする必要がありますが、これを区切り文字として使用するので、sed
他/
の文字を使用できます(たとえば、スラッシュを置き換える必要はありませんが、at文字(または区切り文字として使用する他の文字)。pattern
replacement
's@pattern@replacement@'
/
@
[0-9]\{4\}
4桁の数字{
に戻り、エスケープする必要があるため、エスケープする必要}
があります。bash
([0-9]) は任意の単一の数字と一致し、後で使用できるように (メモリに)「保存」します。その後、置換時(
に括弧で囲まれた一致する部分文字列を使用できます)
(この場合は単一の数値です)。繰り返しますが、私たちはそれらを脱出しなければなりませんbash
。なぜなら。
\1
保存された最初の部分文字列です(前の段落を参照)。\2
2番目と3番目も同じです\3
。
したがって、\([0-9]\+\)\/\([0-9]\+\)\/\([0-9]\{4\}\)
日付に一致するかフォーマットします。dd/mm/yyyy
d/m/yyyy
\3\/\2\/\1
スラッシュ\3
(3番目の部分文字列、年)、(2番目の部分文字列、月)、再び(スラッシュ)、最後に(最初の部分文字列、日付の月)を含む置換。\/
\2
\/
\1