Редактировать файл на месте, не изменяя окончания строк

Редактировать файл на месте, не изменяя окончания строк

Мне нужно изменить исходники под контролем версий 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окончания строк. Любые правки в emacs сохранят и имитируют окончания строк.\r\r\n

Чтобы действительно увидеть, что содержится в файле, вы можете попробовать , 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и проверьте, все ли строки, некоторые или ни одна из них не заканчиваются тремя символами ^M$.

Связанный контент