私の質問はsedに関連しています -逆グレッピングのこの質問に対するこの回答で与えられた特定の解決策。 sed / grep 私が解読できない解決策は次のとおりです:
sed '1!G;h;$!d' file
誰かがこのコマンドを解読できますか?
VI(M)の知識から、Gはファイルの最後の行を示し、sedではbang(!)の後にアドレスが続くことはgrep -vのように機能することがわかります。 つまり、その行とは一致しません。しかし、全体として、上記のインラインsedスクリプトは私を超えています。
承認された回答:
これにより、ファイルが1行ずつ反転します。
sed '1!G;h;$!d' file
まず、sed ホールドスペースがあります およびパターンスペース 。その特定のコマンドに集中する前に、それらを区別する必要があります。
sedの場合 改行を読み取り、パターンスペースにロードされます。したがって、そのスペースは、新しい行が処理されるたびに上書きされます。一方、ホールドスペースは処理全体で一貫しており、後で使用するために値をそこに保存できます。
コマンドへ:
このステートメントには3つのコマンドがあります:1!G 、h および$!d
-
1!GGを意味します コマンドは、最初の行(!)を除くすべての行で実行されます1を無効にします )。G追加することを意味します ホールドスペースにあるものをパターンスペースに入れます。 -
hすべての行に適用されます。 コピー パターンスペースをホールドスペースに(そしてそれを上書きします)。 -
$!d最後の行($を除くすべての行に適用されます 最後の行!を表します それを否定します)。d行(パターンスペース)を削除するコマンドです。
- これで、最初の行が読み取られると、
sedhを実行します 指図。最初の行が保留スペースにコピーされます。次に、$!と一致するため、削除されます。 調子。sed2行目に続きます。 - 2行目は条件
1!に一致します (これは最初の行ではありません)。したがって、ホールドスペース(最初の行があります)がパターンスペース(2番目の行があります)に追加されます。その後、パターンスペースに、改行で区切られた2番目の行とそれに続く最初の行があります。さて、hコマンドが適用されます(すべての行と同様)。パターンスペースにあるものはすべてホールドスペースにコピーされます。 3番目のステートメント($!d)適用:行がパターンスペースから削除されます。 - これで、すべての行でステップ2が完了しました。最後の行にスキップします。
- 最後の行(
$)ステップ2のほぼすべてが完了しましたが、削除部分(dは完了していません) )。sed、-nなしで呼び出された場合 、各入力行の処理の最後にパターンスペースを自動的に印刷します。したがって、削除しない場合は、パターンスペースが印刷されます。すべての行が逆の順序で含まれるようになりました 。