Bu sed komutu nasıl çalışır?


12

Bir metin dosyasından belirli bir satır yazdırmak için bu çözümle karşılaştım:

sed '123!d;q' file

Bu durumda neden ilk girdi satırından sonra sed bırakmıyor?

Yanıtlar:


20

İngilizce olarak, bu sedprogram: her satır için,

  • [ 123!] geçerli satır numarası 123 değilse, [ d] geçerli satırı silin ve sonraki döngüyü başlatın (yani bir sonraki satıra geçin);
  • (ancak bu noktaya yalnızca dkomut yürütülmediyse ulaşırız ), [ q] daha fazla satır işlemeden çıkın (ancak ölmekte olan tahtlarımızdaki geçerli satırı yazdırın).

İsterseniz kabuk sözdiziminde:

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

Teşekkürler, bu da bana temizledi. Benim hata anladım olmasıydı !bağlandı ddeğil 123.
rozcietrzewiacz

@Gilles: parantez eksik {d;q;}, olmamalıdır qher satırı için geçerli (yani sadece ilk)?
enzotib

1
@enzotib qyürütüldüğü her satır için geçerlidir. Ancak satır numarası 123 olmadığında, dkomut yürütülür ve anlamı bir sonraki giriş satırına hemen atlamaktır.
Gilles 'SO- kötü olmayı kes

Kristal netliğinde açıklama
Rahul Patil

Aslında aynı şeyi yapar sed -n 123p(aynı çıktıyı yazdırır), ancak hiçbir şekilde bir şey yapamayacağı potansiyel olarak binlerce daha fazla satırı işlemek yerine 123 satırından sonra durur .
Wildcard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.