問題の診断はどこから始めるべきですか?
どこから始めるべきかさえわかりません。文字列とファイルのランリングを練習していますが、ファイルの最後の行を削除することはできません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
ストリームed
itorであり、ファイルを編集するためのものではありません。ファイルテキストエディタについてはed
、、を参照してくださいex
。vi
sed
標準入力またはファイルの内容(何かが引数として渡された場合)から入力ストリームを取得し、アドレスに一致する各行にスクリプトのコマンドを適用して動的に処理し、フィルタリングされたsed
結果を標準出力に印刷します。
したがって、最後にsed '$d'
カーディング/削除された行()を除くすべての入力が印刷されます。$
d
d
> newfile
その出力を他のコマンド(たとえば、空白の圧着)に追加またはパイプして| tr -s '[:blank:]' ' '
ファイルに保存できます。
perl
-p
(80年代半ば以降)のように見えるようにするオプションがありますsed
。結果が書き込まれるのではなく、ファイルの新しいコピーに書き込まれるように動作を変更するperl
オプションも追加されました-i[.back]
(n-placeの場合)。i
stdoutに変換し、オプションでサフィックスを付けて原稿を保持します.back
。
GNUとFreeBSDの両方の実装は、sed
2000年代初頭に同様の機能を追加しましたが、バックアップが不要な場合は、sed -i '$d' file
GNUとsed -i '' '$d' file
FreeBSDという別の構文を使用します。 sed -i.back '$d'
両方で動作しますsed -i .back '$d'
が、FreeBSDでのみ機能します。
他のいくつかのsed
実装では-i
オプションを追加します。ほとんどはGNU方式ですが、すべてではなく、いずれにせよ、これは標準的なオプションではありません。
sed
唯一のストリームエディタアプリではありません。cat
, awk
, paste
, tr
, , nroff
, eq
, sort
, ... と同じように動作しjoin
、cut
入力を受け取り出力を生成します。アイデアは、Unixシェルスクリプトの強みの1つである特定のタスクを実行するためにそれらを互いにリンクすることです。そのうち、ファイルを所定の場所で編集できる人はほとんどいません。awk
akaのGNU実装にはオプションがgawk
あります-i in-place
。sort
呼び出すことができますsort -o file file
(出力書き込みを開始する前に入力全体を読み取る必要があり、その場合はバックアップがないため)。