sed コマンド交換文字

sed コマンド交換文字

私の入力ファイルのレイアウトは次のとおりです。mm/dd/yyyy,hh:mm,other fields
形式は次のように指定する必要があります。 yyyy-mm-dd hh:mm:00,other fields

入力例:

01/02/1998,09:30,0.4571,0.4613,0.4529,0.4592,6042175
01/02/1998,09:45,0.4592,0.4613,0.4529,0.4571,9956023
01/02/1998,10:00,0.4571,0.4613,0.455,0.4613,8939555
01/02/1998,10:15,0.4613,0.4697,0.4571,0.4697,12823627
01/02/1998,10:30,0.4676,0.4969,0.4613,0.4906,28145145

出力例:

1998-01-02 09:30:00,0.4571,0.4613,0.4529,0.4592,6042175
etc...

私は以下を使用しようとしています:

sed -r 's/\(^[0-9][0-9])\(\/[0-9][0-9]\/)\(\/[0-9][0-9][0-9][0-9],)/\3\1\2/g

答え1

sed -e 's/\(..\)\/\(..\)\/\(....\),\(.....\),\(.*\)/\3-\1-\2 \4:00,\5/'

次のコメントの入力を含めるように編集されました。

sed -e 's#\(..\).\(..\).\(....\),\(.....\),#\3-\1-\2 \4:00,#'

答え2

これは私にとって効果的です。

sed -r 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4}),([0-9:]{5})/\3-\1-\2 \4:00/g'

2桁の数字(([0-9]{2}))、スラッシュ、2桁の数字(([0-9]{2}))、スラッシュ、4桁の数字(([0-9]{4}))、数字、および:([0-9:]{5}))を一致させます。希望の順序(\3-\1-\2 \4:00年 - 月 - 日時:分:00)に置き換えます。

答え3

sed 'y|/|-|
     s/,*\(.....\)-*\([^,]*\)/\2-\1/
     s// \1:00/2
'    <infile

出力:

1998-01-02 09:30:00,0.4571,0.4613,0.4529,0.4592,6042175
1998-01-02 09:45:00,0.4592,0.4613,0.4529,0.4571,9956023
1998-01-02 10:00:00,0.4571,0.4613,0.455,0.4613,8939555
1998-01-02 10:15:00,0.4613,0.4697,0.4571,0.4697,12823627
1998-01-02 10:30:00,0.4676,0.4969,0.4613,0.4906,28145145

一般に、sedそれまで努力する必要はありません。探している一致を明示的に列挙しようとすると通常はやりがいがありません。代わりに、いくつかのランドマーク(区切り文字)を指定し、パターンにトランジションを処理させる方がはるかに簡単なことがよくあります。

上記はsed最初に文字をy///文字に変換します。次に、カンマではなく最初の部分を引用します。/-(最低5個以上の場合)パターンスペースの文字と次の4つの文字は\1無視できます。次に、-パターン空間で次のコンマが発生する前に、^コンマではなく連続した文字が引用される。\2一次交替結果は試合前投入したがmm-dd投入することである。だから私たちはそれらを交換し、次のように反対側に新しいものを削除して挿入します。\1-yyyy\2-

s/.../\2-\1/

最後にもう一度やりましょう。同じパターンを異なる目的で再利用します。私がするとき:

s// \1:00/2

sed最後の正規表現を再利用するように指示しました。(空のアドレスで表示//しかし、今回はパターン空間で2番目に現れるパターンを探そうとします。するこの時間とコンマ一致,*- このフィールドと最後のフィールドを区切るコンマを一致させます。それもHH:MM一致し\1ます。(文字列の後にカンマがあるため)''に空の文字列があります\2。残っているのは\1それ自体に置き換えることです<スペース>以来:00ひも。途中のカンマと空の文字列は編集されます。

感じたら会議でも結局もっと具体的だから、もう少し抽象的だと思う方がはるかに簡単かもしれませんね。正規表現が提供する主な利点は、最初に繰り返し操作の原因を明確に理解する限り、繰り返し操作を迅速かつ効率的に抽象化する方法を提供することです。

正規表現を書くこと自体が反復的な作業になるなら、まあ...何か欠けているかもしれません。しかし、単純な正規表現構文の利点の1つは次のとおりです。また通常、抽象化に適した候補であり、実装が簡単です。

たとえば、

d='[0-9][0-9]' T=$d:$d m=$d y=$d$d
sed -E "s|($m/$d)/($y),($T)|\2-\1 \3:00|;s|/|-|"

答え4

そして可能なawk解決策:

awk 'BEGIN { FS = OFS = ","; } { split($1, d, "/"); $2 = d[3] "-" d[1] "-" d[2] " " $2 ":00"; $1 = ""; } { for (i = 2; i < NF; i++) printf("%s", $i OFS); printf("%s", $NF ORS);}' file

関連情報