unixのパイプで上書きする方法


1

だから私はパイプを使って上書きしようとしています:

    //reads contents of file| turns lowercase to uppercase | changes $ to # |
    // then attempts to overwrite original file with new version
    cat cutTester.txt|tr '[a-z]' '[A-Z]'|tr '$' '#' >cutTester.txt

しかし、これを実行すると、ファイルが消去されます。これはファイルの内容です

    $first$second$third$fourth
    $fifth$sixth$seventh$eighth
    $ninth$tenth$eleventh$twelveth
    $thirteenth$fourthteenth$fifthteenth$sixthteenth
    $seventeenth$eightteenth$nineteenth$twenty
    $twenty-one$twenty-two$twenty-three$twenty-four

回答:


0

何が起こっているのはあなたが切り捨てているということです cutTester.txt を使用して」 > "表記法をリダイレクトします tr 空の入力ファイルのリダイレクトされた出力に対するコマンド。

次もファイルを切り捨てるように注意します。

$ cat cutTester.txt > cutTester.txt

特にあなたが開発者であれば、あなたは次のようなステートメントを書くことに慣れているかもしれません。 x=`eval $x + 1`、その中で eval 式は代入前に評価されます。ただし、リダイレクト演算子の動作は類似していません。ファイルの出力を自分自身にリダイレクトする実装では、シェルが背後で一時ファイルを作成する必要があり、単純に変数を再割り当てするだけの単純で効率的な操作(メモリ内にのみ存在する)とは言えません。

幸いなことに、自分で一時ファイルを明示的に作成するのは簡単です。

#!/bin/bash

# reads contents of file| turns lowercase to uppercase | changes $ to # |
# then attempts to override original file with new version

cat cutTester.txt | tr '[a-z]' '[A-Z]' | tr '$' '#' > cutTester.tmp; mv cutTester.tmp cutTester.txt

あなたはおそらく交換したいと思うでしょう ; とともに && コマンドが失敗したり中止されたりしても元のファイルを失うことはありません。また、 cat コマンドは余分なコピーをするのに時間を浪費しているだけです。 trの入力を単にリダイレクトする tr <cutTester.txt ...
spectras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.