sed が誤って Windows 行末を変更しました。これをどのように避けることができますか?

sed が誤って Windows 行末を変更しました。これをどのように避けることができますか?

私は、Windowsスタイルの行末を持ついくつかのソースファイルから末尾のスペースを削除したいLinux上で移植可能なアプリケーションを開発しています。行末をUNIXに変更しないでください。

"sed"を使用するコードは非常に簡単で、オンラインで見つけることができます。

sed -i.bak -E 's/[[:space:]]+$//' myfile

問題は、これを実行した後、diffファイル内のすべての行(および結果.bak)が異なることです。もちろん、これは本当ではありません。この特定のファイルには、末尾のスペースを含む行が1つしかありません。

hexdump(私が使用するod -x myfile)ユーティリティを使用して確認した結果、元のファイルの最初の行は「0d0a」で終わりますが、sed編集ファイルでは「0a」で終わることは明らかです。

行末に影響を与えずに末尾の空白を削除する方法に関する情報が見つかりません。どのような方法がありますか?

「キャリッジリターン」文字が「[[:space:]]」正規表現グループの一部である場合、おそらく次のようになります。

sed -i.bak -E 's/[ \t]+$//' myfile

動作する必要があります。しかし、そうではありません。同じファイルが生成されます。また、「-e」フラグを試してみましたが、フラグもまったく使用しませんでした。結果ファイルはまだソースファイルと同じで、末尾のスペースは削除されません。

ベストアンサー1

はい、(\r=^M=0x0D) 文字はspace「文字クラス」に属します。 2番目の正規表現で許可するか、ワイルドカードを使用してください。

sed -i.bak -E 's/[ \t]+.$/\r/' myfile

または特定の文字(例:

sed -i.bak -E 's/[ \t]+\r$/\r/' myfile

sedシンボルが認識できない場合は、別の\rシンボルを試してください。 16進数\x0Dまたは8進数と同じです\015

おすすめ記事