我遇到一个问题,我得到的平面文件源包含大量带有 PIPE 分隔符的记录,并且其中一个字段正在获取回车符(多行)并以换行符 ( \n
) 开头。那么如何删除\n
文件中的字符呢?
例子:
-000123456|1654321|6/12/2002 8:49:20 AM|
tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|
谁能建议如何进行?
答案1
如果您知道该字段\n
在所有记录中均以该字段开头,则可以sed
按如下方式使用:
sed "N;s/|\n/|/"
摆脱新线。请注意,由于sed
用作\n
行分隔符,因此您首先必须将下一行连接到已处理的行(命令N
),在此过程中sed
在连接的行之间插入换行符。
如果这个问题是随机出现的(不是在每条记录中),您将不得不求助于更强大的工具来解析文件内容 - 基本上您需要对字段进行计数。或者awk
或者可以优雅地完成这个技巧(我认为它可以在以及perl
中完成,但你可能不想去sed
那个方向)。
答案2
您可以使用许多工具,但sed
这些工具正是针对以下情况而构建的:
sed -i 's,\\n,,g' Flatfile
为了向您展示它是如何工作的,这里是与您刚刚提供的输入相同的表达式:
$ echo '-000123456|1654321|6/12/2002 8:49:20 AM|\n tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|' | sed 's,\\n,,g'
-000123456|1654321|6/12/2002 8:49:20 AM| tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|
它只是查找字符串\n
并将其替换为空的零长度字符串(有效地删除它)。有两个\
,因此\n
失去了其特殊(换行符)含义,可以作为两个字符进行匹配。