bugfix> linux > 投稿

start.txtという名前のファイルが存在します。 start.txtのコンテンツを使用して変更された出力を提供するperlコマンドを使用しており、変更された出力を同じファイルに上書きしようとしています

cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> start.txt

上記のコマンドを実行すると、何らかの理由でファイルstart.txtが空になります

のように出力をリダイレクトするための新しいファイルを作成すると、コマンドに問題はありません。

cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> test.txt

これにより、期待される出力がtest.txtに完全に保存されますが、余分なファイルを作成したくないので、既存のファイル自体を上書きする必要があります。

私は試した >| ファイルを強制的に上書きするために使用されたものを読んだ後、それでも同じ問題。 私も試しました | tee start.txt 、それでもファイルは空になります。

補足:私が使用するいくつかのawkコマンドがあります。awk関数がテキストを読み取るファイルに出力を保存/リダイレクトしようとすると、出力ファイルが空になるという同じ問題が発生します。 誰かが尋ねたら、私もawkコマンドを貼り付けますが、これには普遍的な解決策があると思います

回答 1 件
  • このコマンドでファイルが空になる理由

    cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> start.txt
    
    

    それは

    > start.txt
    
    

    ビット。

    コマンドをシェルに入力すると、シェルはコマンドを解析して実行の準備をします。通信する無名パイプを作成します catperl また、出力ファイルを開き、切り捨てて、リダイレクトします。 perl ファイルへの標準出力。最後に、必要なリダイレクトがすべて整ったので、さまざまなコマンドを開始します。 cat そして perl この場合。しかし、そのファイル cat シェルに要求したリダイレクトによって、読み取ろうとしているものはすでに切り捨てられています。

    コメントですでに指摘したように、最善の策は、読み取っているのと同じファイルに書き込まないようにすることです。

あなたの答え