「1,4p」が最初の4行だけを印刷するのではなく、すべての行を印刷するのはなぜですか?

「1,4p」が最初の4行だけを印刷するのではなく、すべての行を印刷するのはなぜですか?

ランダムな単語を含む「list」というテキストファイルがあります。

he
she
we
his
her
with
his this this -- this
this

このsedコマンドを実行しました。

sed '1,4p' list

私の考えでは、このsedコマンドはファイルの最初の4つの単語を一覧表示するので、出力は次のようになります。

he
she
we
his

ただし、出力は次のようになります。

he
he
she
she
we
we
his
his
her
with
his this this -- this
this

誰が私が間違っているのか、なぜ出力が違うのか教えてもらえますか?

答え1

あなたは忘れました基本動作sedが行うことは、各パターンスペース(ライン)を印刷することです。したがって、デフォルトの動作を抑制するには-nスイッチを追加する必要があります。

sed -n '1,4p' list

答え2

これを使用してください:

sed -n 1,4p list

またはこれ:

sed '1,4!d' list

もっとはい

答え3

一般的な機能は何ですか

スクリプト式は各行で順番に実行されます。

1行で式を実行するには、sedまずその行にコピーします。パターン空間
次に、パターン空間を入力として使用して、すべての式が実行され、結果がパターン空間に書き戻されます。

したがって、通常、その行の作業ステップが完了すると、パターン空間に最終文字列が表示されます。ほとんどの場合、s//複数のコマンドで変更された場合など、出力としてのみ使用します。式が追加されているかのように、最終的なパターンスペースを印刷することが
役に立つことが多いからです。sedp

これにより、発生したコマンドの出力をすでに表示できます。

  • 線はパターン空間に配置されます。
  • スクリプトは以下を使用して、一致する4行のパターンスペースを印刷します。p
  • パターンスペースは完了時に更新されません。
  • すでに式リストの最後にあるので、デフォルトではパターンスペースはそのまま印刷されます。

「全線」を出力しています。そして最初の4行" - "最初の4行だけでなく、すべての行"とは反対です。

したがって、繰り返される行では、各行の最初の行は印刷される内容であり、2行目はデフォルトで印刷される内容です。

オプション(sed)はデフォルトの印刷パターンスペースを切り替えます。-n--quiet

sed -n 1,4p list

元のコマンドが実行する操作を確認するために、2行を異なるように見せることができます。最後に印刷する前に、以下を追加してパターンスペースを変更してください-

$ sed -e '1,4p' -e 's/^/- /'  list
he
- he
she
- she
we
- we
his
- his
- her
- with
- his this this -- this
- this

-eこれらのオプションは複数の式を提供するために必要です。 's / ^ / - /'は行の先頭のすべての項目を置き換えます-。)

関連情報