Jak działa to polecenie sed?

12

Natknąłem się na to rozwiązanie do drukowania określonej linii z pliku tekstowego:

sed '123!d;q' file

Dlaczego sed nie kończy się po pierwszym wierszu wprowadzania w tym przypadku?

Eugene Yarmash
źródło

Odpowiedzi:

20

W języku angielskim ten sedprogram oznacza: dla każdej linii

  • [ 123!] jeśli bieżącym numerem linii nie jest 123, to [ d] usuń bieżącą linię i rozpocznij następny cykl (tj. przejdź do następnej linii);
  • wtedy (ale osiągamy ten punkt tylko wtedy, gdy dpolecenie nie zostało wykonane), [ q] wychodzimy bez przetwarzania kolejnych linii (ale wypisujemy bieżącą linię w naszych umierających bólach).

Lub, jeśli wolisz, w składni powłoki:

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
Gilles „SO- przestań być zły”
źródło
Dzięki, to też mi to wyjaśniło. Mój błąd, że zrozumiałem, !był połączony d, nie 123.
rozcietrzewiacz
@Gilles: brak nawiasów klamrowych {d;q;}, czy nie powinien qodnosić się do każdej linii (a więc tylko pierwszej)?
enzotib
1
@enzotib qma zastosowanie do każdej linii, w której jest wykonywany. Ale gdy numerem wiersza nie jest 123, dpolecenie jest wykonywane, a jego celem jest natychmiastowe przejście do następnego wiersza wprowadzania.
Gilles 'SO - przestań być zły'
Krystalicznie jasne wyjaśnienie
Rahul Patil
Zasadniczo robi to samo co sed -n 123p(drukuje ten sam wynik), z tym że zatrzymuje się po linii 123, zamiast przetwarzać potencjalnie tysiące kolejnych linii, z którymi i tak nigdy nic nie zrobi.
Wildcard,