输入:
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