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

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

Другие вопросы по тегам