我正在处理sed命令。我正在努力实现这一点:
Input: 03:23PM
Output: 15:23PM
我尝试过的sed命令:
echo $line | sed 's/03:..PM/15:..PM/g
我会使用awk
,这样你就可以得到实际的加法,并且可以检测AM
与PM
:
echo '03:23PM
11:33PM
03:23AM' | awk 'BEGIN{FS=OFS=":"} /PM/ && $1<12 {$1=$1+12} 1'
打印:
15:23PM
23:33PM
03:23AM
使用sed
$ sed '/[0-9:]*[AP]M/s/^[^:]*/15/' <<< $line
15:23PM
或者使用@dawg解决方案来处理多个范围的
sed "/PM/s/^[^:]*/echo $((&+12))/e" <<< $line
15:23PM
要记住替换测试的一部分,请使用括号。要引用第一对括号,请使用1
:
sed 's/03:(..)PM/15:1PM/g'
事实上,您可以将:
和PM
都作为捕获组的一部分:
sed 's/03(:..PM)/151/g'
如果您需要在任何类型的上下文中处理此任务,并且考虑到您只需要处理00
-11
小时,则可以使用Perl:
perl -pe 's/(?<!d)(0?d|1[01])(?=:[0-5]?ds*PM)/$1+12/ge' file
请参阅regex演示详细信息:
(?<!d)
-不允许直接在左边的数字(0?d|1[01])
-组1($1
(:一个可选的0
,然后是任何一个数字,或者1
,然后是0
或1
(10
和11
((?=:[0-5]?ds*PM)
-正向前瞻,需要:
,从0
到5
的可选数字,然后是当前位置右侧的任何一个数字、零个或多个空白和PM
子串
$1+12
替换是一个将找到的小时值与12
相加的表达式。
查看在线演示:
#!/bin/bash
text='Time: 00:23PM
Time: 03:23PM
Time: 11:23PM
Time: 12:23PM
Time: 13:45PM'
perl -pe 's/(?<!d)(0?d|1[01])(?=:[0-5]?ds*PM)/$1+12/ge' <<< "$text"
输出:
Time: 12:23PM
Time: 15:23PM
Time: 23:23PM
Time: 12:23PM
Time: 13:45PM