只替换一行的开头



我正在处理sed命令。我正在努力实现这一点:

Input: 03:23PM

Output: 15:23PM

我尝试过的sed命令:

echo $line | sed 's/03:..PM/15:..PM/g

我会使用awk,这样你就可以得到实际的加法,并且可以检测AMPM:

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,然后是01(1011(
  • (?=:[0-5]?ds*PM)-正向前瞻,需要:,从05的可选数字,然后是当前位置右侧的任何一个数字、零个或多个空白和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

相关内容

  • 没有找到相关文章

最新更新