我有一个文件,其中列之间有很多空格。我想用|替换这些空格性格,但只有一次。
我试过这个sed -e "s/ /|/g"
,但它用|来表示evry空间字符。
我的文件包含
Col1 Col2 Col3
A B C
D E F
实际上我是使用脚本从db2获取数据,输出是这样的。我需要在列之间放置一个分隔符,以便以后可以比较这些数据。
我想要这样的输出
Col1|Col2|Col3
A|B|C
D|E|F
我该如何解决这个问题。请帮忙
答案 0 :(得分:1)
匹配具有空格的列,忽略它是否是最后一列。
sed -e "s/(?! *(\w+) *$)( *(\w+) *)/$2|/gm"
( *(\w+) *)
匹配带有空格的单词arround(贪婪)?! *(\w+) *$)
正向前瞻,忽略结束行的匹配$2|
替换为您的分隔符后面的单词实际上我是使用脚本从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'