DOS改行シーケンスを考慮しながら、ファイル内の文字列の発生回数を変更します。

DOS改行シーケンスを考慮しながら、ファイル内の文字列の発生回数を変更します。

私はC#の開発にはVisual Studioを使用し、スクリプトを必要とする一部のタスクにはCygwinを使用します。最近、プロジェクトファイルからすべての文字列をAAABBB私は古くて信頼できるラインシーケンスから始めましたが、sed残念ながらDOSの新しいラインシーケンスがUnixラインシーケンスに変わりました。

これが私が使用するものです:

sed -i 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

sed私が望む機能を実行するスイッチがないようです。私に役立つ他のUnixツールはありますか?

編集:C#ファイルの間にUnix改行文字を持つ別のスクリプトがあります。このツールをDOSバージョンに変更しないことをお勧めします。 :)

答え1

VSには組み込み関数が必要です。

そうでない場合は、以前のバージョンを使用できますvi

vi +'bufdo %s/AAA/BBB/g | update' +q $(grep -rl AAA /cygdrive/c/project_path)

答え2

代わりに、CygwinのPerlを使用できます。一般的なsedコマンドはPerlに簡単にマッピングされます。正規表現の構文は異なります(Perlの拡張正規表現、sedのデフォルトの正規表現)。

perl -i -pe 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

コマンド置換の結果をファイルのリストに解析することは脆弱です。ファイル名にスペースやバックスラッシュが含まれていると壊れます。どちらもWindowsでは非常に一般的です(パスが環境変数から来る場合など、パスがデフォルトからcygwinに変換されていない場合はバックスラッシュが表示されます)。使用してくださいxargs -d '\n'(Windowsファイル名に改行なし)。

grep -rl AAA /cygdrive/c/project_path | xargs -d '\n' perl -i -pe 's/AAA/BBB/g'

関連情報