删除其他换行符

时间:2014-07-17 10:54:02

标签: unix newline

我的输入文件中还有其他换行符。以下是我的文件示例。请帮忙。

H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.com
info@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705

如果您注意到,字段中似乎有一个额外的换行符,其值为tssson@tsas.com info@trddd.com

我需要用空格替换这个换行符。记录应仅以 - H|D|T|

开头

我找到了以下命令,该命令删除了任何不以引号开头的记录的换行符。但是,我需要删除不以H|D|T|开头的任何记录的换行符。

我无法修改下面的命令,因为它不采用例如'H |' (它只考虑第一个字符)。

sed -e :a -e '$!N; s/ *\n\([^"]\)/ \1/; ta' -e 'P;D' file

2 个答案:

答案 0 :(得分:2)

让我们保留一行打印缓冲区:

$ awk '/^[HDT]/ {if (buff) print buff; buff=$0; next} {buff=buff""FS""$0} END{print buff}' file
H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.com info@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705

解释

  • /^[HDT]/ {if (buff) print buff; buff=$0; next}如果行以H,D或T开头,请执行{}
  • if (buff) print buff; buff=$0; next如果缓冲区包含数据,则打印它。然后,将当前行存储在缓冲区中,并使用next转到下一行。
  • {buff=buff""FS""$0}如果该行不以H / D / T开头,请将其内容附加到缓冲区。
  • END{print buff}在处理完文件后打印缓冲区。这样做是为了打印最后存储的缓冲区,即从H / D / T(包括)开始的最后一行的所有内容。

答案 1 :(得分:0)

您可以使用此sed

sed ':a; N; /\n[HDT]/!s/\n//g; t a;' yourfile

下面,

  • N将读取下一行并将其附加到包含\n分隔符的现有行
  • /\n[HDT]/!如果下一行不是以HDT
  • 开头
  • s/\n//g删除新行。

<强>测试

$ sed ':a; N; /\n[HDT]/!s/\n//g; t a;' yourfile
H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.cominfo@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705