使用sed更新文件会使字符出现在行尾

时间:2017-06-19 08:23:14

标签: linux bash redhat

我有一个属性文件。我需要更新一些字段。

dirParam.dprop_release_version=4.1.1
dirParam.dprop_writeToFile=true

所以我运行了以下命令

$  sed -i -e "/dirParam\.dprop_release_version=/ s/=.*/=4\.10\.10/" -e "/dirParam\.dprop_writeToFile=/ s/=.*/=false/" file.properties

更新后,下面是我发现的。它正在更新...

^M
^M
dirParam.dprop_release_version=4.10.10
dirParam.dprop_writeToFile=false^M
^M

但是,我可以在行尾看到"^M"个字符。这是什么,我在哪里,我错了。

注意:Red Hat linux

1 个答案:

答案 0 :(得分:2)

^ M是0x0d,CARRIAGE RETURN。 ([1])您正在查看原始文件中的Windows样式的行结束。

Unix机器仅使用0x0a,LINE FEED,而Windows使用0x0d 0x0a。

当您第一次查看该文件时,其中只有 Windows行结束,并且您用来查看该文件的程序已过滤回车以便于查看。

但是这里......

"/dirParam\.dprop_release_version=/ s/=.*/=4\.10\.10/"

...从=向前删除所有内容,包含回车(因为您的sed认为只是换行前的另一个字节)。您最终得到的文件具有混合行结束(大多数带有回车符,一个没有回车符),因此用于查看文件的程序显示回车符(注意版本行中的缺席):

^M
dirParam.dprop_release_version=4.10.10
dirParam.dprop_writeToFile=false^M

最简单的解决方案是将dos2unix应用于该文件,如@Cyrus建议的那样。如果不可用,sed 's/\r$//'也会这样做。

[1]:为什么0x0d显示为^M?出于同样的原因,0x00显示为^@ ... M为0x4d,@为0x40。 (不可显示的字符加上0x40,由^“转义”。)