ファイルにft
25行のテキストがあるとします。コマンドを説明します。
tail -15 ft | tr "a" "A" > ft
ft
そして、コマンドが実行された後にファイルに何行があるか教えてください。
私はこれがtail -15 ft
ファイルの最後の15行を取りft
、tr 'a' 'A'
何a
でもA
。
> tr
しかし、なぜファイルのすべての内容が削除されるのかわかりません。
答え1
シェルは最初にリダイレクト(この場合> ft
)を設定し、書き込み用に切り取り、開いて残りのft
パイプを設定します。tail -15 ft
空のファイルをインポートし、空の結果を提供し、tr
何も置き換えません。ft
結果は空のファイルです。
答え2
あなたは標準出力リダイレクトまさかリダイレクト出力の追加 元のファイルに出力を追加しようとすると、そうは思いません。。
~からman bash
出力リダイレクトファイルが存在しない場合は作成され、存在する場合はゼロサイズに切り捨てられます。
リダイレクト出力の追加このように出力をリダイレクトすると、単語拡張のために名前が生成されたファイルがファイル記述子nに追加されるか、nが指定されていない場合は標準出力(ファイル記述子1)に追加するために開かれます。ファイルが存在しない場合は生成されます。
したがって、出力を同じファイルにリダイレクトするように指定すると、出力が切り捨てられ、予想される出力が生成されます。
私が推薦するsed
のはredirection
$ tail -15 ft | sed -e 's|a|A|g' > sed_output
答え3
正しいbash表記を使用していません。
Bashでは、ファイルを上書きするには '> file'を使用し、ファイルに追加するには '>> file'を使用する必要があります。代わりに ">>ft" を使用してください。