文件结构:
Col1|Col2|Col3|Col4
123|456|abcdefg
Tel.: 689346589934, xyz
lckhasfkl|abc
我只想从“col3”中删除换行符。请建议
答案1
$ sed -e :1 -e '/|.*|.*|/!{N;b1' -e '}' -e 's/\n/ /g' < your-file
Col1|Col2|Col3|Col4
123|456|abcdefg Tel.: 689346589934, xyz lckhasfkl|abc
或者awk
等价的:
awk -F '|' '{while (NF<4) {getline more; $0 = $0 " " more};print}' < your-file
两个都得到下一行并附加到该行并添加一个空格,只要该行不包含至少 3 个|
字符(4 个字段)。
如果其他字段(第四个字段除外,否则我们无法知道新记录从哪里开始)可能包含换行符,而您只想替换第三个字段中的换行符:
sed '
:1
/|.*|.*|/!{
N;b1
}
:2
s/\n\([^|]*|[^|]*$\)/ \1/
t2' < your-file
或者:
awk -F '|' -v OFS='|' '
{
while (NF < 4) {getline more; $0 = $0 "\n" more}
gsub("\n", " ", $3)
print
}' < your-file
答案2
其他sed
:
sed -e:d -e's/|/|/3;t' -e'N;s/\n//;td' < in >out
sed
通过将一行中的第三个管道字符替换为自身来实现循环。当替换t
成功时sed
,分支会离开 - 因此会自动打印模式空间 - 并从顶部开始使用下一个输入行(如果有)的脚本。但是,当它失败时,会将 ext 行sed
附加N
到模式空间,s///
替换掉中间的换行符分隔符,然后第二个t
est 传递并sed
分支回:d
elim 标签以再次查找第三个管道。