sed - 删除零 - /08/ 到 /8/

Jos*_* C. 5 shell sed text-processing

我需要使用什么 sed 命令将 /08/ 变成 /8/?

我希望摆脱命令输出中所有多余的 0。

我已经把它归结为一个讨厌的额外 0。

sed -ie 's/\/0[1-9]\//\/[1-9]\//g' ~/tmp
Run Code Online (Sandbox Code Playgroud)

输出: at 12:27 AM on 5/[1-9]

sed -ie 's/\/0?\//\/?\//g' ~/tmp
Run Code Online (Sandbox Code Playgroud)

输出: at 12:27 AM on 5/08

完整脚本:

#!/bin/bash

echo $@ > ~/tmp
sed -ie 's/\/0[1-9]\//\/[1-9]\//g' ~/tmp
AA=`awk '{print $2}' ~/tmp | awk -F : '{print $1":"$2}' | sed 's/^0*//'`
BB=`awk '{print $3}' ~/tmp`
CC=`awk '{print $1}' ~/tmp | awk -F / '{print $1"/"$2}' | sed 's/^0*//'`
DD=`awk '{print $5}' ~/tmp | awk -F : '{print $1":"$2}' | sed 's/^0*//'`
EE=`awk '{print $6}' ~/tmp`
FF=`awk '{print $4}' ~/tmp | awk -F / '{print $1"/"$2}' | sed 's/^0*//'`

if [ $# = 3 ]; then
    echo "at $AA $BB on $CC"

elif [ $# = 6 ] && [ $CC = $FF ]; then
    echo "from $AA $BB to $DD $EE on $FF"

elif [ $# = 6 ]; then
    echo "from $AA $BB on $CC to $DD $EE on $FF"
fi
rm ~/tmp
Run Code Online (Sandbox Code Playgroud)

样本输入输出(别名=dt):

使用当前的 sed 命令

dt 05/08/2017 02:27:25 AM

5/[1-9] 凌晨 2:27


没有第一个 sed 命令

dt 05/08/2017 02:27:25 AM

在 5/08 凌晨 2:27


已解决 - 第三行替换为 sed -rie 's/\/0(.?)/\/\1/g' ~/tmp

dt 05/08/2017 01:03:56 AM

输出:5 月 8 日凌晨 1:03

Ser*_*nyy 6

注意:这是一个经过编辑的答案,以使解决方案尽可能通用。查看编辑历史以查看最初所做的工作,并查看对上一个答案的问题的评论。

这里的关键是使用分组 via()-r扩展正则表达式。()将模式分组将允许您根据它们在 via\NUMBER符号中的位置来引用它们。特别是,这是我想出的:

sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g' 
Run Code Online (Sandbox Code Playgroud)

这是这样写的:

  • 匹配零个或多个为零的字符
  • 将一个或多个跟随的任何非零字符组合在一起
  • 然后查找斜杠后跟零个或多个为零的字符
  • 并将后面的一个或多个非零字符组合在一起

在实践中,这对于可变数量的零也是如此:

$ echo "at 12:27 AM on 11/08/2017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                                         
at 12:27 AM on 11/8/2017
$ echo "at 12:27 AM on 00000011/000008/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                           
at 12:27 AM on 11/8/00002017
$ echo "at 12:27 AM on 011/08/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                                    
at 12:27 AM on 11/8/00002017
$ echo "at 12:27 AM on 000000011/0000008/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                         
at 12:27 AM on 11/8/00002017
Run Code Online (Sandbox Code Playgroud)

请注意,如果需要,这可以很好地保留年度部分中的任何内容。如果我们也想摆脱它 - 我们还可以添加第三个分组。

$ echo "at 12:27 AM on 005/0025/0002017" | sed -r 's/0*([^0]+)\/0*([^0]+)\/0*([^0]+)/\1\/\2\/\3/g'                                                    
at 12:27 AM on 5/25/2017
Run Code Online (Sandbox Code Playgroud)

这也适用于其他字符(这不是必需的,但很好):

$ echo "at 12:27 AM on 0November/00Fifth/2017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                             
at 12:27 AM on November/Fifth/2017
Run Code Online (Sandbox Code Playgroud)