Ситуация: небольшой Web-проект разрабатывается несколькими людьми на разных ОС: Windows и Linux. В результате в некоторых файлах перевод строк сделан в стиле Windows, в некоторых - в стиле Unix. Неудобство состоит в том, что если какая-то "интеллектуальная" программа поменяет тип перевода строк, система контроля версий Subversion помечает все строки как изменившиеся, и нужны дополнительные усилия чтобы определить реальные изменения. Поэтому было принято решение определить тип перевода строк в каждом файле, и применить соответствующие меры (например, использовать атрибут svn:eol-style в subversion).Скрипт простой, легко кастомизируется под автоматическую конвертацию (с помощью dos2unix), другие типы файлов, определение стиля Macintosh (в данном случае различается только Windows и Unix):
for FILE in `find -iname '*.php' -or -iname '*.css' -or -iname '*.js' -or -iname '*.txt' -or -iname '*.xml'` ; do
echo -n "$FILE ... " ;
WIN=`grep -P "\r$" $FILE | head`;
if [ -z "$WIN" ] ; then
echo "Unix"
else
echo "Windows"
fi
doneURL:
Обсуждается: http://www.opennet.me/tips/info/2709.shtml
хорошо бы ещё автодетектировать два utf-8 глюкобайта от виндов в начале текстовиков :)
TEXT CONVERSION AND SUBSTITUTION:# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' # works on ssed, gsed 3.02.80 or higher# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/" # command line under ksh
sed 's/$'"/`echo \\\r`/" # command line under bash
sed "s/$/`echo \\\r`/" # command line under zsh
sed 's/$/\r/' # gsed 3.02.80 or higher# IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$//" # method 1
sed -n p # method 2# IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
# Can only be done with UnxUtils sed, version 4.0.7 or higher. The
# UnxUtils version can be identified by the custom "--text" switch
# which appears when you use the "--help" switch. Otherwise, changing
# DOS newlines to Unix newlines cannot be done with sed in a DOS
# environment. Use "tr" instead.
sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 or higher
tr -d \r <infile >outfile # GNU tr version 1.22 or higher
http://sed.sourceforge.net/sed1line.txt
Блин, тут все невесть чем читают... Написано же - им не преобразовывать, а распознавать.
Конвертнуть все в один формат, и нефига распознавать. :)
.
man grep-P, --perl-regexp
Interpret PATTERN as a Perl regular expression. This option is
not supported in FreeBSD.
ну так они его и использовали
он к тому, что на BSD не работает
А, человек читать не умеет... В первой строке написано - Windows и Linux. При чём здесь фря?
> А, человек читать не умеет... В первой строке написано - Windows и
> Linux. При чём здесь фря?Я намекаю, что бывают часто ситуации: проект разрабатывается на Windows и Linux (очень частое явление), но КРУТИТСЯ под FreeBSD (что тоже бывает - см. хостинги под ISPmanager/VDSmanager).
А следующее предложение намекает что у них разработка на винде и линухе с свн.
Что говорит о том, что на хостинг уже не влияет.
в скрипте Unix. а не Linux.
угу. Только относится это к типам окончания строк, а не к тому, на чем скрипт крутится.