次の形式のファイルがあります
----------------------------------------
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
わかりません。 forループを試してオプションを使用できますが、正規表現を使用するより簡単な方法があるかどうかはわかりません。sed
awk
date -d
答え1
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
もちろん、置き換えでも括弧内に一致するパターンに拡張されます。
答え2
私の提案は次のとおりです。
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
----------------------------------------
答え3
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番目の列を目的の形式のこれらの値に置き換えます。