コマンド sed '1!G;h;$!d' ファイルの内容をどのように戻しますか?

コマンド sed '1!G;h;$!d' ファイルの内容をどのように戻しますか?

sed私の質問は、次に提供される特定の解決策に関連しています。この回答この質問についてリバースクエリ。私が解読できない点sed/解決策grepは次のとおりです。

sed '1!G;h;$!d' file

このコマンドを解読できる人はいますか?

私のVI(M)の知識により、Gはファイルの最後の行を意味し、sedからbang(!)の後に次のアドレスが表示されることがわかります。これはgrep -v、対応する行と一致しないことを意味します。しかし、全体的に、上記のインラインsedスクリプトは私の範囲外です。

答え1

これにより、ファイルが1行ずつ反転されます。

sed '1!G;h;$!d'文書

sedまず、スペアスペースそしてパターン空間。特定のコマンドに焦点を当てる前に、まず2つのコマンドを区別する必要があります。

新しい行を読み取ると、sedパターン空間にロードされます。したがって、新しい行が処理されるたびにそのスペースが上書きされます。一方、予約されたスペースは処理全体で一貫しており、後で使用するために値を保存できます。


コマンドへ:

1!Gこのステートメントには、hおよび 3 つのコマンドがあります。$!d

  • 1!GGこれは、コマンドが最初の行(負!)を除くすべての行で実行されることを意味します1G引用する追加予約済みスペースの内容をパターンスペースに入れます。

  • hすべての行に適用されます。それコピースペースを予約済みスペースにパターン化して上書きします。

  • $!d最後の行を除くすべての行に適用されます($最後の行を意味し、!これを無効にします)。dライン(パターン空間)を突き抜けていくという命令です。


  1. 最初の行を読むとコマンドがsed実行されますh。最初の行は予約済みスペースにコピーされます。その後、$!基準を満たしているため削除されました。sed2行目に進みます。
  2. 2行目は条件と一致するため1!(最初の行ではない)、予約済みスペース(1行目がある)がパターンスペース(2行目)に追加されます。その後、パターン空間には2行目があり、その後に最初の行があり、改行文字で区切られます。これでhコマンドが適用されます(すべての行と同様)。パターンスペースのすべての内容が予約済みスペースにコピーされます。 3番目の説明($!d)が適用されます。行がパターン空間から削除されます。
  3. これで、すべての行がステップ2を完了しました。最後の行に進みます。
  4. 最後の行($)では、削除部分(d)を除いて、2つのステップがほぼすべて完了しました。sed、なしで呼び出されると、-n各入力行の処理の終わりにパターンスペースが自動的に印刷されます。そのため、削除しないとパターンスペースが印刷されます。これで、次のすべての行が含まれます。逆順で

関連情報