0

unix2dosC++ ソース コード ファイルのグループで使用しようとしています。基本的に、unix2dosLF を CRLF に変換します。

私は単に次のことを行うことができ、それは私が望むことを行います:

#!/bin/sh
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec unix2dos {}\;

しかし、CRLF行末が既にある場合、ファイルを変更したくありません。そのため、スクリプトを変更する必要があります。

#!/bin/sh
for i in `find . -type f \( -name "*.h" -o -name "*.cpp" \)` 
do
  LINE=`file $i | grep CRLF`
  if [ $? -eq 1 ]
  then
    unix2dos $i
  fi
done

スペースが正しく処理されていないため、forループを使用するのは少し難しいようです。ファイル名にスペースが含まれている場合、シェルは分割された文字列に誤って unix2dos を適用しようとします。

問題を解決するにはどうすればよいですか?

4

5 に答える 5

1

コマンドを次のように変更するだけunix2dosです (putnamhill upper によって提供されます)。

`perl -wpi -e 's/([^\r])\n/$1\r\n/g' $1`;

次に、前のfindコマンドを実行します。

#!/bin/sh
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec unix2dos {}\;

これで準備は完了です。

于 2013-12-13T09:25:33.333 に答える
1
  • for ループで find コマンドの出力を処理しないでください。

  • シェルで変数を適切に引用する必要があります。

代わりに次のコードを試してください。

#!/bin/sh
find . -type f \( -name "*.h" -o -name "*.cpp" \) | while read i
do
  LINE=`file "$i" | grep -c CRLF`
  if [ $LINE -eq 0 ]
  then
    unix2dos "$i"
  fi
done

更新: BASH を使用することにした場合は、このループをより効率的に行うことができます。次のコードを検討してください。

#!/bin/bash
while read file
do
  grep -q $'\r'"$" "$file" && unix2dos "$file"
done < <(find . -type f \( -name "*.h" -o -name "*.cpp" \))

< <(...)構文はプロセス置換と呼ばれ、現在のシェル自体で上記のwhileループを作成するため、現在のシェルプロセスでシェル変数を設定し、サブシェル作成の分岐を節約できます。

于 2013-12-12T16:45:37.203 に答える
0

Unix2dos は LF を CRLF に変更しますが、CRLF を CRCRLF に変更しません。既存の DOS 改行は変更されません。したがって、あなたが望むことを行う最も簡単な方法は次のとおりです。

unix2dos *.h *.cpp

よろしく、エルウィン

于 2013-12-16T08:24:01.693 に答える