このsedコマンドはどのように機能しますか?


12

テキストファイルから特定の行を印刷するためのこのソリューションに出くわしました。

sed '123!d;q' file

この場合、入力の最初の行の後にsedが終了しないのはなぜですか?

回答:


20

英語では、このsedプログラムは次のことを意味します。各行に対して、

  • [ 123!]現在の行番号が123でない場合、[ ]は現在の行をd削除し、次のサイクルを開始します(つまり、次の行に移動します)。
  • その後(ただし、dコマンドが実行されなかった場合にのみこのポイントに到達します)、[ q]はそれ以上行を処理せずに終了します(ただし、死にゆくスローで現在の行を出力します)。

または、必要に応じて、シェル構文で:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

ありがとう、それは私にもそれをクリアしました。私のエラーは、私!がつながっているのdではなく、理解していたということでした123
rozcietrzewiacz

@Gilles:中括弧が欠落しているため、すべての行に適用{d;q;}すべきではありませんq(最初の行のみ)。
enzotib

1
@enzotib qは、実行されるすべての行に適用されます。ただし、行番号が123でない場合、dコマンドは実行され、その意味はすぐに次の入力行にスキップすることです。
ジル 'SO-悪であるのをやめる'

非常に明確な説明
ラーフルパティル14年

本質的には同じことを行いますsed -n 123p(同じ出力を出力します)が、とにかく何もしない可能性のある数千行を処理するのではなく、123行目以降で停止することを除いて。
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.