如何阻止 sed 添加额外的换行符

如何阻止 sed 添加额外的换行符

我正在运行以下 2 个sed命令。第一个在我想要的地方添加换行符,第二个也在我想要的地方添加换行符,但还在文件末尾添加了一个额外的换行符,而以前没有换行符。

sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml

sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml

od -c对所有 3 个文件使用会产生以下输出。

statements_tmp_1.xml(\n文件末尾没有)

1314700    T   A   T   E   M   E   N   T   >   <   /   L   I   S   T   _
1314720    G   _   S   T   A   T   E   M   E   N   T   >   <   /   G   _
1314740    S   E   T   U   P   >   <   /   L   I   S   T   _   G   _   S
1314760    E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1314777

statements_tmp_2.xml(\n文件末尾没有)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >   <   /   G
1314740    _   S   E   T   U   P   >   <   /   L   I   S   T   _   G   _
1314760    S   E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1315000

statements_tmp_3.xml(\n在文件末尾 - 它来自哪里?)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >  \n   <   /
1314740    G   _   S   E   T   U   P   >   <   /   L   I   S   T   _   G
1314760    _   S   E   T   U   P   >   <   /   A   R   X   S   G   P   O
1315000    >  \n
1315002

我运行的是 AIX 5.3

基本上,我要么希望它停止添加额外的\n,要么找到一种方法来删除它。

答案1

您应该认为自己很幸运,AIXsed添加了缺少的换行符。

不以换行符结尾的非空文件不是文本文件(至少根据文本文件的 POSIX 定义),因为文本文件意味着包含行,并且行是(不太-长)字符序列,以换行符结尾,因此文本实用程序(如其sed上)的行为是未指定的,并且实际上因实现而异。

某些sed实现会忽略最后一行之后的那些虚假字符。

AFAIK,xml文件应该是文本文件,所以这意味着sed刚刚为您修复了它。

如果您确实需要该文件不以换行符结尾,那么您可以使用perl或其他可以处理非文本数据的工具。

perl -pe 's|<LIST_G_STATEMENT>|$&\n|g'

答案2

以下是使用以下方法从文件中删除最后一个换行符的方法dd

printf "" | dd  of='/path/to/file' seek=<filesize_in_bytes - 1> bs=1 count=1

要测试文件是否以换行符结尾,您可以使用:

tail -c 1 /path/to/file | tr -dc '\n' | wc -c

要获取文件大小(以字节为单位),请使用:

wc -c < /path/to/file

答案3

根据这个AIX手册IBMtail确实-r如此——看起来很酷。只要您的文件小于 20KB,以下操作就应该有效:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new

相关内容