在这种情况下,如何从文本文件中替换制表符空格

时间:2014-11-12 17:48:11

标签: linux shell text replace space

我有这个文件:

Tue Nov 11 10:32:10 2014        172.18.0.240    csotelo tty1    172.18.1.131    stop    task_id=88      timezone=UTC    service=shell   priv-lvl=15     cmd=configure terminal <cr>

我使用了那个命令:

sed -e 's/\s\+/,/g' input.txt > output.txt

来自output.txt的结果:

Tue,Nov,11,10:32:10,2014,172.18.0.240,csotelo,tty1,172.18.1.131,stop,task_id=88,timezone=UTC,service=shell,priv-lvl=15,cmd=configure,terminal,<cr>

期望的输出:

Tue Nov 11 10:32:10 2014,172.18.0.240,csotelo,tty1,172.18.1.131,stop,task_id=88,timezone=UTC,service=shell,priv-lvl=15,cmd=configure terminal <cr>

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

这并不是那么简单,因为你想在某些地方替换多个空格(比如日期和IP之间),还要在其他地方(“csotelo”和“tty1”之间)替换单个空格。所以一个简单的模式是不够的,你需要能够分辨出这些案例的东西。使用awk的例子可能是:

awk '{print $1 " " $2 " " $3 " " $4 " " $5 "," $6 ...}'

其中...应该继续输出以空格或逗号分隔的字段,以便在每个特定情况下执行您要执行的操作,直到最后一个字段为止。这样做是在空白上拆分行,然后在另一个之后输出一个元素,用空格或逗号分隔。

答案 1 :(得分:0)

你走了:

sed -e 's/\s\{2,\}/,/g' input.txt > output.txt

你的正则表达式使用+,意思是“一个或多个”,但你不想替换单个空格。

  • {2,}表示“介于两个和无限之间”或“两个或更多”。
  • {2}表示“正好两个”。
  • {2,5}表示“介于两个和五个之间”。
  • {,5}表示“介于零和五之间”或“多达五个”。