使用sed

时间:2015-10-14 07:35:43

标签: regex bash sed

我有一个文件,其中列之间有很多空格。我想用|替换这些空格性格,但只有一次。

我试过这个sed -e "s/ /|/g",但它用|来表示evry空间字符。

我的文件包含

Col1  Col2  Col3 
     A     B   C
 D E    F

实际上我是使用脚本从db2获取数据,输出是这样的。我需要在列之间放置一个分隔符,以便以后可以比较这些数据。

我想要这样的输出

Col1|Col2|Col3 
A|B|C
D|E|F

我该如何解决这个问题。请帮忙

5 个答案:

答案 0 :(得分:1)

匹配具有空格的列,忽略它是否是最后一列。

sed -e "s/(?! *(\w+) *$)( *(\w+) *)/$2|/gm"
  • ( *(\w+) *)匹配带有空格的单词arround(贪婪)
  • ?! *(\w+) *$)正向前瞻,忽略结束行的匹配
  • $2|替换为您的分隔符后面的单词

http://regexr.com/3bvrs

  

实际上我是使用脚本从db2获取数据,输出是这样的。

您可能有标签(\t)而不是空格,它是" csv" 导出的公共分隔符。此外,如果您可以修改脚本,则可以为导出指定分隔符。

答案 1 :(得分:1)

awk OFS='|'会更简单:

awk -v OFS='|' '{$1=$1} 1' file
Col1|Col2|Col3
A|B|C
D|E|F

{$1=$1}是一种告诉每条记录都已更改的方法,因此最终使用OFS作为分隔符来重写记录。

答案 2 :(得分:0)

替换数据之间的多空格,但不替换标题或拖车空间

sed -e ':redo' -e 's/\([^[:blank:]]\)[[:blank:]]\{1,\}\([^[:blank:]]\)/\1|\2/g;t redo'

由于sed行为(不包括g选项中已采用的模式),此posix兼容版本需要2次传递

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^\s+//;s/\s+/|/g' file

删除前导空格并用|

替换所有其他空格

答案 4 :(得分:0)

我已使用此

解决了上述问题

sed -e 's/[ ]\{1,\}/|/g'