关于bash:使用sed从字段中间删除换行符

 2021-04-09 

Using sed to remove new line characters from the middle of a field

我拥有的数据看起来像这样

1
2
3
4
a,b,c,d
a,b1
b2,c,d
A,B,C,D

正在发生的事情是,在字段2中偶尔在第二个字段中有一个换行符,因此该行被分成了两行

到目前为止,我已经找到了一个sed脚本,它将像

所示进行此操作

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

但是我正在努力获取(。*,)的正确组合以使此工作正常进行,因此我已将其替换为b1以使此示例正常工作,但在现实世界中,A,B,C和D为实地长度和含量的混合

我正在寻找的最终结果是这个

1
2
3
a,b,c,d
a,b1b2,c,d
A.B,C,D

非常感谢您的帮助

谢谢
马特


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

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

如果在前三列之一中有换行符,这将起作用。到目前为止,它还不能与"行"中的多个换行符一起使用。

说明:
(^|\
)
匹配行的开头(分别是换行符)
[^,]+,表示:至少一个字符(+表示一个或多个)!
([^,]+,){0,2}如果有0-2列以","分隔,则匹配
[^,]+表示0-2列后面有一些(至少一个)字符!=","。
尾随\
匹配换行符

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


在awk中

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