我有一个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副本。
答案 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;}'
删除文件中的空最后一行),如果文件已用换行符结束,则撤消回声造成的损坏。