,
ファイルを改行に置き換えるコマンドを実行しています
echo `tr ',' '\n' < file.txt` > file.txt
このコマンドは変換中です
a,b,c
に
a b c
に変換するのではなく
a
b
c
誰かが私にそれが起こっている理由を説明し、これを回避することができますか?
まず、入力と出力の両方を同じファイルにリダイレクトしてコマンドを実行するのは危険です。これまで見てきたように、たまたま機能することもありますが、ファイルを読み取ろうとすると、発生する順序によってはファイルの内容が破壊される可能性があります。
その問題を回避するために、コマンドを単純化しましょう。
$ cat file.txt
a,b,c
$ tr , '\n' < file.txt
a
b
c
したがって、tr
コマンド自体は期待どおりに機能しています。それでは、出力をエコーしてみましょう。
$ echo `tr , '\n' < file.txt`
a b c
シェルはコマンドを実行し、その出力をecho
-- への引数として使用しますが、出力は空白 (改行を含む) で区切られた単語に分割されます。
sh、bash、または同様のシェルを使用している場合は、引数を引用することでこれを回避できます。
$ echo "`tr , '\n' < file.txt`"
a
b
c
$(...)
シェルがサポートしている場合 (ほとんどの場合)、バッククォートではなく使用できます。
$ echo "$(tr , '\n' < file.txt)"
a
b
c
構成の最初と最後を簡単に区別できるので、少し読みやすいと思います。ネストすることもできます。
最後に、少なくともあなたがしていることについては、 を使用しても意味がありませんecho
。これが私がそれを行う方法です:
tr , '\n' < file.txt > $$ && mv $$ file.txt
これは の内容をfile.txt
変換し、出力を一時ファイルに書き込みます ($$
は現在のシェルのプロセス ID で、一時ファイル名の生成に便利です)。次に、一時ファイルの名前をfile.txt
-- に変更しますが、最初のコマンドが成功した場合のみです。これにより、何か問題が発生した場合に入力ファイルが破壊されるのを回避できます。
これはおそらくあなたが探しているものです。
tr ',' '\n' < file.txt > tempFile.txt
mv tempFile.txt file.txt
Perhaps this
sed -i 's , \n g' file.txt