web-dev-qa-db-ja.com

ファイル内のsedまたはawkで日付形式を変更する

次の形式のファイルがあります

----------------------------------------
  Name: cust foo
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20170721085748Z
----------------------------------------
  Name: cust xyz
  mail: [email protected]
  Account Lock: TRUE
  Last Password Change: 20181210131249Z
----------------------------------------
  Name: cust bar
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20170412190854Z
----------------------------------------
  Name: cust abc
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20191030080405Z
----------------------------------------

Last Password Changeデータ形式をYYYY-MM-DDに変更したいのですが、sedまたはawkを使用して変更する方法がわからない場合や、他の方法がある場合は、forループを試すことができますそれとdate -dオプションを使用しますが、正規表現を使用する簡単な方法があるかどうかはわかりません

2
Satish

2つのダッシュを追加し、余分な文字をいくつかドロップするだけなので、dateはあまり必要ありません。

$ sed -Ee 's/(Last Password Change: )(....)(..)(..).*Z/\1\2-\3-\4/' < foo.txt
...
  Name: cust foo
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2017-07-21
...

より厳密なパターンの場合、ドット(任意の文字に一致する)を[0-9]に置き換えて、数字のみに一致させることができます。もちろん、置換の\1などは、括弧内のパターンが一致するものに拡張されます。

8
ilkkachu

これは私の提案です:

sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}Z/\1-\2-\3/' file

出力:

  Name: cust foo
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2017-07-21
----------------------------------------
  Name: cust xyz
  mail: [email protected]
  Account Lock: TRUE
  Last Password Change: 2018-12-10
----------------------------------------
  Name: cust bar
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2017-04-12
----------------------------------------
  Name: cust abc
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2019-10-30
----------------------------------------
4

次のawkコマンドでこれを達成できました。

awk -F\: '$1 ~ /Last Password Change/{ OFS=":"; $2 = substr($2, 1, 5)"-"substr($2, 6, 2)"-"substr($2, 8, 2) }1'

:をフィールド区切り文字として使用し、最初の列がLast Password Changeと一致する場合は、substrを使用して年、月、日付を抽出し、2番目の列をあなたが望むフォーマット。

4
jesse_b