テキストファイルから特定の行を印刷するためのこのソリューションに出くわしました。
sed '123!d;q' file
この場合、入力の最初の行の後にsedが終了しないのはなぜですか?
テキストファイルから特定の行を印刷するためのこのソリューションに出くわしました。
sed '123!d;q' file
この場合、入力の最初の行の後にsedが終了しないのはなぜですか?
回答:
英語では、この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;q;}すべきではありませんq(最初の行のみ)。
qは、実行されるすべての行に適用されます。ただし、行番号が123でない場合、dコマンドは実行され、その意味はすぐに次の入力行にスキップすることです。
sed -n 123p(同じ出力を出力します)が、とにかく何もしない可能性のある数千行を処理するのではなく、123行目以降で停止することを除いて。
!がつながっているのdではなく、理解していたということでした123。