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

使用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

+3

我建议使用'dos2unix文件名'来摆脱'^ M'。 – Cyrus

^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,“转义”^。)

+0

执行此命令$ sed -i -e“/dirParam\.dprop_release_version=/ s /=.*/= 4 \ .10 \ .10 /”-e“/dirParam\.dprop_writeToFile=/ s /=.*/ = false /“file.properties – BalaB

+0

然后sed的/ \ r $ //'file.properties> file-temp.properties – BalaB

+0

然后mv file-temp.properties file.properties – BalaB