有没有办法告诉unix expand命令不改变行结尾?

时间:2012-12-12 09:42:39

标签: bash unix cygwin expand

我正在使用带有bash shell的cygwin版本扩展。

致电expand以将所有\t替换为 (空格)expand时,也会将所有换行结尾从\n更改为\r\n

我正在使用以下bash脚本:

#!/bin/bash

BRANCH=$1

TMPFILE=/tmp/temporaryExpander

EXTENSIONS=(
    cpp
    cxx
    h
    java
    txt
    cs
    csproj
    vcproj
    sln
    csdproj
)

function TabsToSpacesForFile
{
    relativeFilePath=$1
    absoluteFilePath=`pwd`/$relativeFilePath

    expand --tabs=4 $absoluteFilePath > $TMPFILE
    cat $TMPFILE > $absoluteFilePath
}

for project in `ls $BRANCH`
do
    for extension in "${EXTENSIONS[@]}"
    do
        find $BRANCH/$project -name "*\.${extension}" | while read file; do TabsToSpacesForFile "$file"; done
    done
done

3 个答案:

答案 0 :(得分:1)

而不是:

expand --tabs=4 $absoluteFilePath > $TMPFILE
cat $TMPFILE > $absoluteFilePath

为什么不试试:

sed -i 's/\t/    /g' $absoluteFilePath

根本不应该弄乱行结尾。

答案 1 :(得分:0)

执行dos2unix "$file"将行结尾转换回unix样式。

  

Dos2unix包中包含实用程序“dos2unix”和“unix2dos”来转换DOS中的纯文本文件          或者Mac格式为Unix格式,反之亦然。

     

在DOS / Windows文本文件中,换行符(也称为换行符)是两个字符的组合:a          回车(CR)后跟换行(LF)。在Unix文本文件中,换行符是单个          character:换行(LF)。在Mac文本文件中,在Mac OS X之前,换行是单一的          回车(CR)字符。如今Mac OS使用Unix风格(LF)换行符。

答案 2 :(得分:0)

怎么样

function TabsToSpacesForFile
{
    relativeFilePath=$1
    absoluteFilePath=`pwd`/$relativeFilePath
    absoluteFilePathLineEndings=false
    expand --tabs=4 $absoluteFilePath > $TMPFILE
    file $absoluteFilePath | grep -q CRLF && dos2unix $TMPFILE
    cp $TMPFILE $absoluteFilePath
}

我假设所有都是文本文件;没有二进制文件。

另外,最后你应该rm $TMPFILE。如果需要,引用$ absoluteFilePath等变量。