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


17

我正在运行以下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给出了下面的输出。

statement_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

statement_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

statement_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,要么找到一种删除它的方法。


只是一个问题:为什么您本来也可以使用替换模式中的文字换行符s|...|&\n|呢?
Joseph R.

1
@JosephR。\n在右侧不便于携带。
斯特凡Chazelas

@StephaneChazelas太奇怪了。是CR vs CRLF吗?
Joseph R.

2
没有以换行符结尾的文件不是文本文件,因此未指定文本实用程序的行为。使用perl或其他可以处理二进制数据的工具。
斯特凡Chazelas

4
@JosephR。不,这\<LF>是添加LF字符的传统方式和POSIX方法。\n通常会用nGNU以外的任何字符代替字符sed
斯特凡Chazelas

Answers:


10

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

不能以换行符结尾的非空文件不是文本文件(至少根据文本文件的POSIX定义),因为文本文件包含行,并且行是(非太long)以换行符结尾的字符序列,因此文本实用程序(如sed在其上)的行为是不确定的,并且在实践中因实现而异。

sed在最后一行之后,某些实现将消除那些虚假的字符。

AFAIK,xml文件应为文本文件,因此sed就为您解决了该问题。

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

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

1
如果希望将输出通过管道传输到任何其他标准Unix实用程序,则终止换行符会很有sed。老实说,我已经sed多年没有注意到这一点了,因为$(sed 's/bas/replac/' <<<'basement')如果有的话,Bourne shell命令的替换就像偷偷地修剪了最后的换行符。但也有时候,你肯定不希望它; 例如,使用操纵X剪贴板文本sed。FYI,GNU sed(如果可用),如果您将p其与-n选项一起使用,则不会添加终止换行符,如本SE回答所述
TheDudeAbides

0

这是使用以下方法从文件中删除最终换行符的方法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

0

根据这一AIX手册 IBM的tail确实-rEVERSE -这看起来很酷。只要您的文件小于20KB,以下文件就可以工作:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.