我想在中间插入一个空格,以便字符串
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
答案 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
形成最终替换(你可以输入任意数量的(或很少的)空格。