入力ファイルラインのループで最後の反復を表示する方法はありますか?

入力ファイルラインのループで最後の反復を表示する方法はありますか?

direction次の行を含むファイルがあるとします。

east
north
south
west
south-west

ループを使用し、echoシェルスクリプトから次の出力を生成します。

Direction: east
Direction: north
Direction: south
Direction: west
Last direction: south-west

つまり、スクリプトの最後の行で別の操作を実行したいと思います。

ベストアンサー1

bashファイルの終わりを検出する方法はありませんが(次の行を読み取ろうとせずに失敗します)、Perlはそのeof機能を使用できます。

$ perl -n -e 'print "Last " if eof; print "Direction: $_"' direction 
Direction: east
Direction: north
Direction: south
Direction: west
Last Direction: south-west

注:echoBashとは異なり、Perlのステートメントは1.印刷する文字列に含めて明示的に指定するか、2. Perlのコマンドラインオプションを使用するか、3.文字列に新しい行を含める場合を除きprint、改行を印刷しません。 - の場合なので改行文字を削除するのによく必要です。\n-l$_chomp()

Perlでは、BTWは$_現在の入力ラインです。あるいは、実際の変数名を指定しないループの基本イテレータ(しばしば「現在のエントリ」と呼ばれます)たくさん$_指定しない場合、Perl関数と演算子はデフォルト/暗黙のパラメータとして使用されます。表示man perlvarと検索$_

sedまた動作します。$アドレスはファイルの最後の行と一致します。

$ sed -e 's/^/Direction: /; $s/^/Last /' direction 
Direction: east
Direction: north
Direction: south
Direction: west
Last Direction: south-west

ルールの順序がsed重要です。私の最初の試みは間違った方向に進みました(そして「方向:最後の南西」が印刷されました)。この sed スクリプトは常に各行の先頭に "Direction:" を追加します。最後の行($)では、前のステートメントによって変更された行の先頭に「Last」を追加します。

おすすめ記事