使用sed更新文件使字符出现在行尾
问题描述:
我有一个属性文件。我需要更新一些字段。使用sed更新文件使字符出现在行尾
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
答
^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,“转义”^
。)
我建议使用'dos2unix文件名'来摆脱'^ M'。 – Cyrus