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

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

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

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

可能なすべての提案を受け入れます。ありがとうございます。

答え1

2 つの簡単な置換を行います。

sed 's/:/-/;s/:/-/'

答え2

[質問に答えてください。これは、実際の日付比較の問題を解決する最善の方法ではないかもしれません。]

1つのアプローチは、ループを使用して一度に1つのコロンを置き換えることです。結果に 2 つのハイフンが含まれている場合、ループを中断します。

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

または、GNU sedがある場合は、次のように置き換えることができます。みんなコロンの前にはハイフンが入り、3番目のハイフンから再びコロンに置き換えられます。

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

答え3

| sed 's/\([0-9]*\).*/\1/'

これは最初の数字文字列を保存し、その後のすべての数字を食べて.*その数字を再び保存するので、事実上それ以降のすべての数字は2018消えます。

最初の2つの数値文字列をキャプチャし、区切り文字を追加して置き換える必要があります。いいえ残りの行を一致させます。

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

答え4

上記の結果を得るために、次の2つの方法を使用した。

方法 1 は awk gsub 関数を使用します。

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

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

方法 2 は sed を使用します。

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

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

Perlの使い方3

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

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

関連情報