FTPを使用してWindowsファイルをUnixシステムに送信し、^M
改行文字を必要とするファイルを追加しましたが、単に削除したいと思いました。
私が持っているオプションの1つは、dos2unix
コマンドを実行することです。
そのようなパターンを削除する他の方法(sed
コマンドなど)を提案できる人はいますか?
答え1
Windows 行末は、2 つの文字シーケンス CR、LF で構成されます。 CRはキャリッジリターン文字であり、時にはなどで\r
表されます\015
。^M
Unixの行末はLF文字です。
すべてのUnixバリアントに存在する標準ユーティリティのみを使用してWindows行末をUnix行末に変換するには、次のようにします。tr
便利です。
tr -d '\r' <thefile >thefile.new && mv thefile.new thefile
ファイルにすでにUnix行の終わりがある場合、その内容は変更されません。
現在のディレクトリに変換するファイルが多い場合は、ループを使用できます。名前が終わるファイルがないとします.new
。
for x in *; do
tr -d '\r' <"$x" >"$x.new" && mv "$x.new" "$x"
done
Linux(一部の組み込みLinuxシステムを除く)またはCygwinでは、次のものを使用できます。sed
。ファイルを内部で編集するオプションは、-i
これらのシステムにのみ適用されます。 CR文字表現\r
はより一般的ですが、普遍的ではありません。
sed -i -e 's/\r//g' thefile
答え2
DOS2 Unix:
sed -i -r -e 's/\r$//' file
UNIX2DOS:
sed -i -r -e 's/$/\r/' file
答え3
sed -i -r -e 's/\r$//' file
「dos2unix」の場合よりも優れています。sed -i -e 's/\r//g' file
後者の場合、古典的なMacスタイルファイル(改行文字が '\ r'の場合)で実行すると、新しいファイルはUnixスタイルではなく改行文字もまったくありません。すべてがソートされます。
編集:もう一度コメントで述べたように、sed 's/^M//g' file
^記号は行の先頭のsedコードなので、行の先頭のすべてのMを削除するので、sedを使用することをお勧めします。前にMのみの複数行のテキストファイルを作成し、そのsedコマンドを使用すると改行以外には何も出力されませんでした。
答え4
使用sed:
sed 's/^M//g' filename > newfilename