`sed '$d' file`が最後の行を削除しないのはなぜですか?

`sed '$d' file`が最後の行を削除しないのはなぜですか?

問題の診断はどこから始めるべきですか?

どこから始めるべきかさえわかりません。文字列とファイルのランリングを練習していますが、ファイルの最後の行を削除することはできませんsed '$d' file.sh。また、sudoを試してみました(これもうまくいきませんでした)。

私の情報源によると、私の注文はうまくいくでしょう。

cat、および同じtailものを使用して印刷できることを知っており、head -n -1それを使用して削除できる必要があることも読みましたが、私が見つけた唯一の信頼できるソースは文字通り行を削除することです。https://linuxhint.com/sed-command-to-delete-a-line/上記のコマンドを使用するように求められます。それは動作しません

最高の推測?

-iこのコマンドがファイルの最後の行を正常に削除したことを確認しました。 -iは動作しますが、-iがなければなぜ動作しませんか? -iを含めないと、後で何が起こりますか?ハードドライブが破損していますか?

答え1

sed(1970年代のコマンド)はsストリームeditorであり、ファイルを編集するためのものではありません。ファイルテキストエディタについてはed、、を参照してくださいexvi

sed標準入力またはファイルの内容(何かが引数として渡された場合)から入力ストリームを取得し、アドレスに一致する各行にスクリプトのコマンドを適用して動的に処理し、フィルタリングされたsed結果を標準出力に印刷します。

したがって、最後にsed '$d'カーディング/削除された行()を除くすべての入力が印刷されます。$dd

> newfileその出力を他のコマンド(たとえば、空白の圧着)に追加またはパイプして| tr -s '[:blank:]' ' 'ファイルに保存できます。

perl-p(80年代半ば以降)のように見えるようにするオプションがありますsed。結果が書き込まれるのではなく、ファイルの新しいコピーに書き込まれるように動作を変更するperlオプションも追加されました-i[.back](n-placeの場合)。istdoutに変換し、オプションでサフィックスを付けて原稿を保持します.back

GNUとFreeBSDの両方の実装は、sed2000年代初頭に同様の機能を追加しましたが、バックアップが不要な場合は、sed -i '$d' fileGNUとsed -i '' '$d' fileFreeBSDという別の構文を使用します。 sed -i.back '$d'両方で動作しますsed -i .back '$d'が、FreeBSDでのみ機能します。

他のいくつかのsed実装では-iオプションを追加します。ほとんどはGNU方式ですが、すべてではなく、いずれにせよ、これは標準的なオプションではありません。

sed唯一のストリームエディタアプリではありません。cat, awk, paste, tr, , nroff, eq, sort, ... と同じように動作しjoincut入力を受け取り出力を生成します。アイデアは、Unixシェルスクリプトの強みの1つである特定のタスクを実行するためにそれらを互いにリンクすることです。そのうち、ファイルを所定の場所で編集できる人はほとんどいません。awkakaのGNU実装にはオプションがgawkあります-i in-placesort呼び出すことができますsort -o file file(出力書き込みを開始する前に入力全体を読み取る必要があり、その場合はバックアップがないため)。

関連情報