2

私はタイムスタンプとして日付と時刻を含む文字列を持っています= 12-12-2012 16:45:00

タイムスタンプ = 16:45:00 12-12-2012に再フォーマットする必要があります

シェルスクリプトでこれを達成する方法は?

注: 変数の値は12-12-2012 16:45:00であり、タイムスタンプは変数の名前です

#!usr/bin/expect
set timestamp "16:45:00 12-12-2012"
Now what should i do so value of timestamp will become 12-12-2012 16:45:00
script extention is .tcl example test.tcl
4

4 に答える 4

4

可変パターン除去を使用できます。##は、「左から順に、パターンに一致するものをすべて削除する」ことを意味します。%%は、右から同じことを意味します。

tm=${timestamp##* }
dt=${timestamp%% *}
result="$tm $dt"

または、cutを使用して同じことを行い、フィールド区切り文字を指定することもできます。

tm=$(echo $timestamp | cut -f2 -d' ')
dt=$(echo $timestamp | cut -f1 -d' ')
result="$tm $dt"

または、sedを使用して正規表現と交換することもできます(他の投稿を参照)。

または、dateコマンドから日付を取得する場合は、次のようにフォーマットするように依頼できます。

result=$(date +'%r %F')

さらに言えば、日付を解析して、必要に応じて表現できるバージョンの日付がある場合があります。

result=$(date -d '12/12/2012 4:45 pm' +'%r %F')

確かに、この最後の1つは、日付の入力に注意が必要です...受け入れられる入力については、「情報の日付」を参照してください。

あなたが正規表現を使いたいのなら、私はPerlが好きです...彼らは書くのがよりきれいです:

echo $timestamp | perl -p -e 's/^(\S+)\s+(\S+)/$2 $1/'

ここで、\ Sはスペース以外の文字に一致し、+は「1つ以上」を意味し、\sはスペースに一致します。ペアレンは、一致したパーツをキャプチャします。

編集:

申し訳ありませんが、「timestamp=」が実際のデータの一部であることに気づいていませんでした。上記の例はすべて、最初にそのビットを取り除くと機能します。

var='timestamp=2012-12-12 16:45:11'
timestamp=${var#timestamp=}
... then as above ...
于 2012-12-21T02:21:50.810 に答える
2

sedの使用:

sed 's/\([0-9]*-[0-9]*-[0-9]*\)\([ \t]*\)\(.*\)/\3\2\1/' input

このコマンドは、パターンを含む行で機能しますnumber-number-number whitespace antyhingnumber-number-numberパーツ\([0-9]*-[0-9]*-[0-9]*\)anythingパーツと交換するだけで\(.*\)、元の空白も保持されます\([ \t]*\)。したがって、sedの置換部分はです \3\2\1。これは、3番目の部分、空白、および最初の部分を意味します。

tclと同じロジック:

set timestamp "12-12-2012 16:45:00"
set s [regsub {([0-9]*-[0-9]*-[0-9]*)([ \t]*)(.*)} $timestamp \\3\\2\\1]
puts $s
于 2012-12-21T02:21:40.140 に答える
1

ソリューションはこちら:

string="timestamp= 12-12-2012 16:45:00"
awk '{print $1, $3, $2}' <<< "$string"
于 2012-12-21T02:23:43.963 に答える
0

bash (および同様のシェル) の場合:

$ timestamp="12-12-2012 16:45:00"
$ read -a tsarr <<< "$timestamp"
$ echo "${tsarr[1]} ${tsarr[0]}"
16:45:00 12-12-2012
于 2012-12-21T02:38:29.957 に答える