vim 为什么^M字符被附加在每一行的末尾?

mrfwxfqh  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(253)

我在Linux中使用“sed”执行查找-替换操作。我在Linux中有一个名为config.xml的XML文件。该文件包含以下数据-

<CATALOG>
 <SERVER>
  <URL value="http://ip-172-44-0-92.compute.internal:440/" />
 </SERVER>
</CATALOG>

我想在config.xml文件中查找包含<URL value=的行,并将整行替换为<URL value="http://ip-181-40-10-72.compute.internal:440/" />
我试着执行命令-

sed -i '/<URL value=/c\<URL value=\"http://ip-181-40-10-72.compute.internal:440/\" />' config.xml

该命令执行正确,并找到替换操作,但当我打开文件使用vi config.xml我看到^M字符在每一行的末尾没有被替换。为什么会发生这种情况,如何修复它?
编辑-
参考@Atalajaka的答案...我的原始文件在每一行的末尾都包含CRLF行尾。并且,sed用LF行尾替换该行。因此,所有其他未替换的行仍然会有CRLF行尾,并且'vi'编辑器现在会在这些行的末尾显示^M
因此,解决方案是通过运行以下命令将CRLF结尾替换为LF结尾-

sed -i $'s/\r$//' config.xml
xytpbqjk

xytpbqjk1#

如果原始XML文件的每一行都有CRLF行尾,则该问题可能与原始XML文件有关。如果是这种情况,vim将识别并隐藏它们,这样它们对您来说就不重要了。假设这样,所有使用vim添加的新行都将包含这些相同的CRLF行尾。
sed命令在添加任何新行时使用LF行尾,因此当这种情况发生时,vim会看到两个不同的行尾,并将LF行尾假定为常规行尾。这意味着所有CR行尾都将显示为^M
如果您在编辑之前可以访问原始XML文件,则可以在vim中打开它,然后检查文件名旁边的页脚是否显示[dos],例如:

$ vim original_xml.xml

...

"original_xml" [dos] ...

Source

相关问题