如何删除文件中间的换行符?

如何删除文件中间的换行符?

文件结构:

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///替换掉中间的换行符分隔符,然后第二个test 传递并sed分支回:delim 标签以再次查找第三个管道。

相关内容