用sed替换不同的事件

时间:2014-06-19 14:52:00

标签: bash sed

可能是一个简单的问题,但我无法弄清楚。如何使用sed以不同的方式替换不同的事件?

我举一个例子:

a="2012_01_01_05_05_05"

期望的输出:

mod_a="2012-01-01 05:05:05"

我知道如何处理sed的唯一方法是:

mod_a=`echo $a | sed 's/_/ /g'`

我可以通过删除" _",将其转换为数组,并根据每个元素创建一个新表达式,但它不那么优雅。

4 个答案:

答案 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是原生的,但对于人来说是“只写的”。