web-dev-qa-db-ja.com

sedコマンドを使用して、文字列内の最初の2つの「:」を置き換えます

Date(bash)コマンドを使用して、YYYY:MM:DD HH:MM:SSの形式で2つの日付を比較しようとしています。私の問題は、dateコマンドが(私が知る限り)日付形式YYYY-MM-DD HH:MM:SSのみを使用することです。正規表現でsedを使用して、最初の2つの:-に置き換えようとしましたが、機能させることができませんでした。 2018年しか取得していません。

date1="2018:01:16 12:25:35"
echo $date1 | sed 's/\([0-9]*\).*/\1/'

考えられる提案をすべて受け付けて、ありがとうございます。

2
Fxbaez

[質問に答える-実際の日付比較の問題に取り組む最善の方法ではない可能性がありますが]

1つの方法は、ループを使用してコロンを一度に1つずつ置き換え、結果に2つのハイフンが含まれている場合にループから抜け出すことです。

echo '2018:01:16 12:25:35' | sed ':a; /^[^-]*-[^-]*-/ b; s/:/-/; ta'
2018-01-16 12:25:35

または、GNU sedの場合、allコロンをハイフンに置き換えてから、3番目以降のハイフンを再びコロンに置き換えることができます。

echo '2018:01:16 12:25:35' | sed 's/:/-/g; s/-/:/3g'
2018-01-16 12:25:35
1
steeldriver

単純な置換を2回実行するだけです。

sed 's/:/-/;s/:/-/'
6
user1404316

GNU date コマンドを直接使用することを検討してください。

date1=$(date +”%Y-%m-%d %H-%M-%S”)
1
Jeff Schaller
| sed 's/\([0-9]*\).*/\1/'

これにより、最初の数字の文字列が保存され、その後は.*ですべてが食べられ、それらの数字が元に戻されるため、2018以降はすべて消えます。

数字の最初の2つの文字列と、それらを置き換えるための区切り文字をキャプチャする必要があります。not行の残りの部分と一致します。

$ echo "2018:01:16 12:25:35" | sed 's/\(....\):\(..\):/\1-\2-/'
2018-01-16 12:25:35
1
ilkkachu

上記の結果を達成するために、以下の2つの方法を使用しました

awkgsub関数を使用するmethod1

echo $date1| awk '{gsub(":","-",$1);print $0}'

出力2018-01-16 12:25:35

Sedを使用した方法2

echo $date1 |sed "s/:/-/"| sed "s/:/-/"

出力2018-01-16 12:25:35

Perlを使用するMethod3

echo $date1| Perl -pne "s/:/-/"| Perl -pne "s/:/-/"

出力2018-01-16 12:25:35

1