WindowsからUnixにいくつかのファイルをコピーしただけで、それらはすべて^M
最後にあります。vi を使用してそれらを削除する方法は知っていますが、一度に 1 つのファイルしか削除できません。フォルダ内のすべてのファイルに対して削除する方法はありますか? 60 ほどのファイルがあり、それらすべてを手動で行うのは時間がかかります。
他のツールの使用も歓迎します!
PS: OS は Solaris です
ありがとう
後世のために、VI 内からソリューションを投稿しましょう。次のように、すべての行の末尾にあるCtrl-を削除できます。M
:%s/^V^M$//
これはあなたが入力したものであることに注意してください.wnere^V
はCtrl-Vおよび-を^M
意味します. ここでの考え方は、次の ^M を「エスケープ」して、置換正規表現で一致させることができるようにすることです。CtrlM^V
そして、%
表現は「これをすべての行で行う」という意味です。
設定によっては、これが vim で機能する場合と機能しない場合があることに注意してください。
しかし、あなたの質問は、複数のファイルを簡単に変更できないviでこれを行う方法を尋ねています。他のツールを使用することにオープンである場合は、質問でその旨を示してください。
単一のファイルまたはストリームで sed を使用できます。
$ printf 'one\r\ntwo\r\n' > /tmp/test.txt
$ od -c < /tmp/test.txt
0000000 o n e \r \n t w o \r \n
0000012
$ sed -i'' -e 's/^M$//' /tmp/test.txt
$ od -c < /tmp/test.txt
0000000 o n e \n t w o \n
0000010
$
この場合、FreeBSD の /bin/sh で、^M
... ご想像のとおり ... を使用してエスケープしました^V
。
sed の-i
オプションを使用すると、複数のファイルを指定でき、それらはすべてその場で変更されるため、スクリプトでこれをラップする必要がなくなる可能性があります。とにかくこれをスクリプトに入れたい場合は、試してみて、うまくいかない場合は助けを求めることをお勧めします。それが StackOverflow のやり方です。:-)
または、Jonathan の for ループの例を使用してください。一時ファイルは必要ありません。
アップデート
sed
オプションがない場合-i
でも、 for ループでこれを非常に簡単に実行できます。
[ghoti@pc ~]$ od -c /tmp/test1.txt
0000000 o n e \r \n t w o \r \n
0000012
[ghoti@pc ~]$ for f in /tmp/test*.txt; do sed -e 's/^M$//' "$f" > /tmp/temp.$$ && mv -v /tmp/temp.$$ "$f"; done
/tmp/temp.26687 -> /tmp/test1.txt
/tmp/temp.26687 -> /tmp/test2.txt
[ghoti@pc ~]$ od -c /tmp/test1.txt
0000000 o n e \n t w o \n
0000010
コマンドを使用しdos2ux
ます。
dos2ux file >file2