就地編輯文件而不修改行結尾

就地編輯文件而不修改行結尾

我需要修改 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$

相關內容