我有一个属性文件。我需要更新一些字段。
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
答案 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,由^
“转义”。)