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

264
jww

Мне нужно изменить источники под контролем версий 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" ... 

Как выполнить замену без добавления посторонних пробелов?

0

1 ответ на вопрос

1
meuh

В эти дни emacs будет автоматически определять окончания строк, используемые в файле, и поэтому вы не увидите, есть ли в файле \nили \rили \r\nокончания строк. Любые изменения в emacs сохранят и имитируют окончания строк.

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

***"I'm assuming you are on a Unix system..."*** - yes (kind of). I'm on a Linux system, not Unix: *"...I then executed the following from a script from a Linux machine""* . jww 8 лет назад 0
To get back to the orginal question: *"How do I perform a replacement without adding extraneous whitespace?"*. I don't think that's provided in your answer. jww 8 лет назад 0
At the top of your working directory can you try the following commands: `git config core.eol` `git config core.autocrlf` `find . -name .gitattributes -o -name attributes` and if they show anything add the results to your question. Also, does `cat -vet cryptest.vcproj` before the edit show the line endings as 3 chars `^M$` on all lines, only some, or none. meuh 8 лет назад 0

Похожие вопросы