使用sed替换,我怎么能在最后添加空格?

时间:2018-01-24 00:29:57

标签: bash sed

我想在中间插入一个空格,以便字符串

up 2 days, 12:32

变为

up 2 days,  12:32

我一直试图使用sed替换来做到这一点。我的sed函数看起来像

sed 's/,/, /'

我觉得这应该有效,但尾随的空白被忽略了。

我尝试过使用' \'看看我是否能逃脱空白。我不知道发生了什么,因为逗号之前的空格不会被丢弃。我觉得这个问题很多,但我找不到任何对我有用的东西。

编辑:这是我在

中呼叫sed的完整命令
echo "    "`uptime | cut -d ' ' -f3-6 | sed 's/,$//' | sed 's/,/, /'`

我希望输出为

up 2 days,  12:32

但我得到了

up 2 days, 12:32

3 个答案:

答案 0 :(得分:2)

作为@Jerry的建议,将反引号放在双引号内:

echo "    `uptime | cut -d ' ' -f3-6 | sed 's/,$//' | sed 's/,/, /'`"

作为@tripleee建议,这是一个较短的解决方案,sed一次调用:

uptime|sed 's:,  .*$::;s:, :,  :;s:^.*up:    up:'
            ^          ^         ^
            |__________|_________|___ s:,*  .*$::     remove ',  ' (2 spaces) to end
                       |_________|___ s:, :,  :       add one space after ','
                                 |___ s:^.*up:    up: add spaces before 'up'

适用于单日或多日。测试:

$ a=' 12:02:45 up  1:09,  1 user,  load average: 0.06, 0.13, 0.16'
$ b=' 12:02:45 up  2 days, 20:30,  1 user,  load average: 0.06, 0.13, 0.16'
$ sed 's:,  .*$::;s:, :,  :;s:^.*up:    up:' <<<"$a"
     up  1:09
$ sed 's:,  .*$::;s:, :,  :;s:^.*up:    up:' <<<"$b"
     up  2 days,  20:30

答案 1 :(得分:1)

也许保持一切简单 - 为什么它必须在sed或awk输出到stdout时回显?这是使用GNU uptime的输出 - 我不知道它是否会有所不同,所以可能需要调整

uptime | 
awk '{ 
  printf "%s %s %s,  %s\n", $2, $3, $4, substr($5,0,5) 
}'

您可能还想更正格式,在开头添加一些空格

答案 2 :(得分:0)

如果您愿意,可以通过一次调用sed和反向引用来完成此操作,例如

$ uptime | 
sed 's/^[^u]*\(up [0-9][0-9]* days*\)[^0-9]*\([0-9][0-9]*:[0-9][0-9]\).*$/\1,  \2/'
up 1 day,  11:02

或具有多天(相同的正则表达式)的机器:

$ uptime | 
sed 's/^[^u]*\(up [0-9][0-9]* days*\)[^0-9]*\([0-9][0-9]*:[0-9][0-9]\).*$/\1,  \2/'
up 134 days,  4:19

基本正则表达式只需找到up digits day(s),然后找到hours:minutes(作为反向引用\1\2捕获),然后用\1, \2形成最终替换(你可以输入任意数量的(或很少的)空格。