我正在运行以下 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