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 AM5/[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
注意:这是一个经过编辑的答案,以使解决方案尽可能通用。查看编辑历史以查看最初所做的工作,并查看对上一个答案的问题的评论。
这里的关键是使用分组 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)