find と sed を使用して行末の文字を削除する

find と sed を使用して行末の文字を削除する

Java から Scala に変換されたコードベースには、末尾に不要なセミコロンが付いたファイルが多数あります。以下は、それらを削除する私の試みです。

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done

(注: gsedMac では since を使用するとsedゴミになります。)

しかし、これは単に目的を果たしません。セミコロンが削除されないのです。

次のような単一のファイルで実行することに注意してください:

for f in  $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done

する仕事。

答え1

これは絶対に使用しないでください:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

これはうまくいくそれまでファイル名に空白文字やその他のシェルで有効な文字が含まれている場合、シェルは次のように処理します。単語の分割そしてパス名の拡張の出力に$(find . -name \*.scala)。それがなくても、シェルは実行します単語の分割 そしてパス名の拡張およびコマンド$f内の引用符で囲まれていない の出現について。echogsed

この場合、幸いなことに、確実に動作するコードを書くのは簡単です。find の-execオプションを使用するだけです。

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +

同時に末尾のセミコロンを削除する場合は、sedスクリプトにもう 1 つの置換コマンドを追加します。

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +

答え2

sedを実行する前に、これらすべてを実行したほうがよいかもしれませんdos2unix。dos2unixを入手するにはどうすればいいかと疑問に思うかもしれません。これが、ここに別の回答を追加する主な理由です(コメントを追加するのに十分な評判がまだないためです)。OSXで生き残りたいのであれば、Homebrew パッケージ マネージャーHomebrewをインストールした後(2分)最初にすることはbashを更新する!! OSX は何年も bash を更新していません。これで、UNIX ユーティリティを更新できます。

過去に MacPorts や Fink で悪い経験をしたことがある方のために言っておきますが、Homebrew はそのようなものではありません。本当に。Homebrew のない OSX は、Cygwin のない Windows のようなものです。まあ、実際にはそうではありませんが、その意味はおわかりでしょう。

答え3

理由が分かりました。ファイルには^M(DOS スタイルCRLF) が含まれていたため、まず次の操作を実行する必要がありました。

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

その後、OP に示されているコマンドは正常に機能します。

関連情報