2011-05-05 18 views
1

我有数据看起来像这样使用sed将来自现场的中间除去新行字符

a,b,c,d 
a,b1 
b2,c,d 
A,B,C,D 

正在发生的事情是,在2场有偶尔在第二场换行符太行被分散在两行

到目前为止,我还发现了一个sed脚本,将做到这一点倒像是

cat file| sed ':a;N;$!ba;s/\(\(b1\)\)\n/\1/g' 

,但我努力获得的正确组合(*。 ,)使这项工作,所以我已经取代它与b1得到这个例子的工作,但在现实世界A,B,C和D是混合长度和内容领域

我期待的最终结果对于本

a,b,c,d 
a,b1b2,c,d 
A.B,C,D 

任何帮助深表感谢

感谢 马特

+0

是AWK好吗?对我来说更像awk。 – MJB 2011-05-05 14:59:32

回答

1

我这里有一个解决方案,还没有完美的 - 但我会再考虑一下。如果您的sed版本支持扩展正则表达式,你可以这样做:

cat file | sed -r ':a;N;$!ba;s/((^|\n)([^,]+,){0,2}[^,]+)\n/\1/g' 

如果有前三列的一个换行符,将工作。到目前为止,它还没有在一个“行”中使用多个换行符。

说明:!
(^|\n)的行的开头(RESP换行符)
[^,]+,意味着匹配:至少一个(+意味着一个或多个)字符= “” 接着是”, “
([^,]+,){0,2}如果存在用”,“分隔的0-2列,则匹配 [^,]+表示在0-2列之后有一些(至少一个)字符!=”,“。
尾随\n匹配换行符

概括了s命令将匹配包含与在端部具有换行符0-3列中的所有行,并且将自身(\1)代替它不包括尾部换行符。

+0

非常感谢这对一个行突破很好,但我必须承认我不真的了解代码! – matt1234 2011-05-05 15:06:48

+0

@ matt1234:我会添加一个解释。 – bmk 2011-05-05 15:09:44

+0

为什么在你不需要猫时使用猫? 'sed -r'...' Benoit 2011-05-05 15:15:39

0

在awk中

awk -F, 'NF < 4 {getline nextline; $0 = $0 nextline} 1' filename