使用sed从字段中间删除新行字符

时间:2011-05-05 14:38:18

标签: bash shell unix sed cat

我看起来像这样的数据

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

非常感谢任何帮助

由于 马特

2 个答案:

答案 0 :(得分:2)

我这里有一个尚未完美的解决方案 - 但我会进一步思考它。如果您的sed版本支持扩展正则表达式,则可以执行以下操作:

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

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

说明:
(^|\n)匹配行的开头(分别为换行符)
[^,]+,表示:至少有一个(+表示一个或多个)字符!=“,”后跟“,”,
如果有0-2列用“,”分隔,([^,]+,){0,2}匹配 [^,]+表示在0-2列后面有一些(至少一个)字符!=“,” 尾随\n与换行符匹配

总结s命令将匹配包含0-3列的所有行,并在末尾添加换行符,并将其替换为自身(\1),不包括尾随换行符。

答案 1 :(得分:0)

在awk中

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