2017-06-19 36 views
1

我有一個屬性文件。我需要更新一些字段。使用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

回答

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,「轉義」^。)

+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