如何使用例如 sed 将 1:52 变为 01:52?

如何使用例如 sed 将 1:52 变为 01:52?

输入:

a|2013.06.13. 13:22|xx
b|2013.06.13. 1:52 |xx
c|2013.06.13. 2:26 |xx

输出:

a|2013.06.13. 13:22|xx
b|2013.06.13. 01:52 |xx
c|2013.06.13. 02:26 |xx

在这种情况下如何使 1:52 变为 01:52?

更新:谢谢!这些工作得很好,但是我怎样才能删除分钟和“|”之间的空格?如果加0呢?

$ sed -e 's/ \([0-9]:\)/ 0\1/' b.txt 
a|2013.06.13. 13:22|xx
b|2013.06.13. 01:52 |xx
c|2013.06.13. 02:26 |xx
$ perl -wpe 's/(\d+):/sprintf( "%02d:",$1)/e' b.txt 
a|2013.06.13. 13:22|xx
b|2013.06.13. 01:52 |xx
c|2013.06.13. 02:26 |xx
$ 

哇.. :)

答案1

sed -e 's/ \([0-9]:\)/ 0\1/'

如果空格和冒号之间出现单个数字,则添加零。如果您还想去掉分钟后的空格,那就是

sed -e 's/ \([0-9]:[0-9][0-9]\) / 0\1/'

答案2

找到冒号之前的数字并将其打印为两位前导零的数字:

perl -wpe 's/(\d+):/sprintf("%02d:",$1)/e'

要解决空间问题,您可以稍微扩展表达式:

perl -wpe 's/(\d+):(\d+) +\|/sprintf("%02d:%02d|",$1,$2)/e'

或者,如果您只想完全匹配您的情况:

perl -wpe 's/ (\d:\d\d) \|/ 0$1|/'

答案3

这可能对你有用(GNU sed):

sed 's/\b[0-9]:/0&/' file

答案4

非 sed 版本:

$ cat sample.txt 
a|2013.06.13. 13:22|xx
b|2013.06.13. 1:52 |xx
c|2013.06.13. 2:26 |xx
c|2013.06.13. 2:6 |xx
$ while read l; do
>   IFS=" |:" read -a array <<< "$l"
>   printf "%s|%s %02s:%02s|%s\n" ${array[0]} ${array[1]} ${array[2]} ${array[3]} ${array[4]}
> done < sample.txt
a|2013.06.13. 13:22|xx
b|2013.06.13. 01:52|xx
c|2013.06.13. 02:26|xx
c|2013.06.13. 02:06|xx

相关内容