sed命令创建一个0字节的文件

时间:2014-05-29 03:48:32

标签: shell sed

我有一个shell脚本,它复制一个xml文件并将其放在一个目录中。现在,一旦复制了xml,我执行sed操作以将标记值替换为其他值。我使用以下命令:

sed "s#ABC-XYZ#DEF-PQR#g" test.xml > test-newfile.xml

该命令正确执行,但它创建了大小为0字节的新xml“test-newfile.xml”。所以我猜,这个命令工作但不知何故无法创建xml的新副本。

test.xml不为空:

-rw-rw-r-- 1 sujeet11 sujeet   0 May 28 23:06 test-newfile.xml
-rw-rw-r-- 1 sujeet11 sujeet 555 May 28 23:04 test.xml

现在这是有趣的部分: 如果我在vi模式下打开test.xml而不对xml进行任何更改,如果我使用:wq保存它然后执行相同的sed操作,它将替换字符串并使用更新的字符串创建newfile副本。

1 个答案:

答案 0 :(得分:2)

将一些评论转移到答案中。

听起来好像你错过了文件末尾的换行符(并且文件中只有一行数据)。编辑时,vim会添加换行符。我试图将其作为可能的麻烦来源; Mac OS X 10.9.3上的GNU sed和BSD sed都可以使用由空字节,500 x&s组成的文件,并且没有换行符(或者在换行符时使用换行符相同)端)。

失败的test.xml是否以换行结束?使用vim编辑的文件副本是否以换行符结尾?如果一个失败而另一个失败,那就是问题 - 文本文件应该以换行符结束,如果文件没有以换行符结尾,则调用未定义的行为。许多版本的sed无论如何都会起作用;有些人不会。

  

是的,你是对的。失败的test.xml不会以新行结束。我使用vim对其进行编辑后,会以换行符结束。谢谢!我该如何照顾它?在执行sed操作之前附加新行的任何其他方法吗?

将新换行添加到文件末尾可能最简单,无论是否已存在,可能使用:

echo "" >>test.xml

然后您可以使用:

sed -e 's#ABC-XYZ#DEF-PQR#g' -e '/^$/d' test.xml

删除所有空行(或-e '${/^$/d;}'删除文件中的空最后一行),如果文件已用换行符结束,则撤消回声造成的损坏。