2015-10-14 84 views
0

我有一个文件,其中列之间有很多空格。我想用|替换这些空格性格但只有一次。使用sed替换字符串的组合只有一次

我试过这样的sed -e "s/ /|/g",但它将evry空间与|字符。

我的文件包含DB2使用脚本和正在添加输出这样

Col1 Col2 Col3 
    A  B C 
D E F 

其实我获取数据。我需要在列之间加上一个分隔符,以便以后可以比较这些数据。

我想这样

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

输出我怎样才能解决这个问题。请帮助

+0

假设列之间有3+个空格,试试'sed -e“s/{3,}/|/g”'。 –

+2

通过什么标准你可以告诉在D和E之间应该有一个管道,而不是在'Col'和'1'之间(例如)?这确实是问题归结为什么。我猜测数据字段在实际输入中不包含单个字母。我们需要更多地了解实际的投入,才能提出明智的建议。 – Wintermute

+0

这是我的错误。我已经编辑了这个问题 – insanity

回答

0

我已经使用这个

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

解决上述问题
1

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

sed -e "s/(?! *(\w+) *$)(*(\w+) *)/$2|/gm" 
  • (*(\w+) *)比赛与空间角落找寻(贪婪)
  • ?! *(\w+) *$)正预测先行词,忽略匹配,它结束行
  • $2|由字,接着你的分隔符来替换

http://regexr.com/3bvrs

其实我正在使用脚本从db2中获取数据,并且输出结果如下所示。

你可能有标签(\t)而不是空格,其“CSV”出口共同分离。另外,如果您可以修改脚本,则可以为导出指定分隔符。

+0

好的建议来修复源代码的格式 –

0

替换数据之间multispace,但不能用于报头也没有拖车空间

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

由于SED行为(不包括在一个g选项已经采取图案),2通需要与此POSIX兼容版本

1

awkOFS='|'会更简单在这里:

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

{$1=$1}是一种告诉每个记录已经改变的方式,因此它最终使用OFS作为分隔符来重写记录。

0

这可能为你工作(GNU SED):

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

删除前导空白并取代所有其他的空格|