无需修改行尾即可就地编辑文件

无需修改行尾即可就地编辑文件

我需要在 Git 版本控制下修改源代码。源代码是 Visual Studio 项目文件,这使得它们成为 Microsoft 原生文件。我想避免空白问题,包括行尾游戏。

我在 emacs 下查看了修改前的文件,^M显然不存在。

然后我从 Linux 机器上的脚本执行了以下命令:

sed -i 's/odbc32.lib //g' *.vcproj
sed -i 's/odbccp32.lib //g' *.vcproj

当我看到这些变化时:

$ git diff cryptest.vcproj
diff --git a/cryptest.vcproj b/cryptest.vcproj
index cec447d..9ae71ea 100644
--- a/cryptest.vcproj
+++ b/cryptest.vcproj
@@ -76,7 +76,7 @@
...
Name="VCLinkerTool"
-        AdditionalDependencies="odbc32.lib odbccp32.lib Ws2_32.lib"
+        AdditionalDependencies="Ws2_32.lib"^M
        SuppressStartupBanner="true"
...

如何在不添加多余的空格的情况下进行替换?

答案1

如今,emacs 会自动检测文件中使用的行尾,因此您无法看到文件是否有\n\r\r\n行尾。emacs 中的任何编辑都会保留并模仿行尾。

要真正了解文件的内容,您可以尝试cat -vet显示控制字符,包括^M、制表符(^I)和行尾($)。

请注意,git可以配置为在工作目录和对象数据库之间移动文本文件时自动转换\r\n\n或反之亦然。请参阅此文章和这个文章检查你的 git 是如何配置的(全局和每个存储库的配置),以及如何更改它。

很难看出如何sed引入\r。我假设您使用的是 Unix 系统。


在工作目录的顶部检查以下命令是否未显示任何内容:

git config core.eol
git config core.autocrlf
find . -name .gitattributes -o -name attributes

运行原始未编辑的文件cat -vet并检查所有、部分或没有行以 3 个字符结尾^M$

相关内容