可能是一个简单的问题,但我无法弄清楚。如何使用sed以不同的方式替换不同的事件?
我举一个例子:
a="2012_01_01_05_05_05"
期望的输出:
mod_a="2012-01-01 05:05:05"
我知道如何处理sed的唯一方法是:
mod_a=`echo $a | sed 's/_/ /g'`
我可以通过删除" _",将其转换为数组,并根据每个元素创建一个新表达式,但它不那么优雅。
答案 0 :(得分:3)
这可能是方式
mod_a=`echo $a | awk -F_ '{print $1"-"$2"-"$3,$4":"$5":"$6}'`
答案 1 :(得分:2)
简单的sed解决方案:
sed 's/_/-/;s/_/-/;s/_/ /;s/_/:/g' <<< "$a"
它将第一个和第二个_
替换为-
,第三个_
替换为空格,其余的替换为:
。
答案 2 :(得分:1)
试试这个GNU sed命令,
$ echo '2012_01_01_05_05_05' | sed -r 's/_/-/g;s/^(.*)-([0-9]+)-([0-9]+)-([0-9]+)$/\1 \2:\3:\4/g'
2012-01-01 05:05:05
它将所有_
替换为-
。从输出中,它再次根据-
划分数字并将其存储到组中。这些组在替换部件中反向引用,并根据我们所需的输出进行格式化。
对于您的情况,
$ mod_a=$(echo $a | sed -r 's/_/-/g;s/^(.*)-([0-9]+)-([0-9]+)-([0-9]+)$/\1 \2:\3:\4/g')
$ echo $mod_a
2012-01-01 05:05:05
答案 3 :(得分:1)
您已标记了问题bash
。如果你有GNU Bash,为什么你在尝试使用sed
来做这么简单的事情?
$ a="2012_01_01_05_05_05"
$ IFS='_' read Y m d H M S <<< "$a"
$ mod_a="$Y-$m-$d $H:$M:$S"
$ echo "$mod_a"
2012-01-01 05:05:05
大量的斜线和短划线没有任何优雅,这对于sed
是原生的,但对于人来说是“只写的”。