Co robi opcja `-n` w sed?

13

To jest wpis strony podręcznika dla -n:

-n

wyłącz automatyczne drukowanie przestrzeni wzorów

Zauważam, że gdy nie używam -ndo niektórych operacji, każda linia jest drukowana na standardowym wyjściu (a żądane linie są drukowane dwukrotnie):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

Jednak to prawo nie dotyczy innych poleceń:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Co -ndokładnie robi ?

dotancohen
źródło

Odpowiedzi:

17

Zwykle sed przetwarza każdą linię (wykonując zamiany itp.), A następnie drukuje wynik. Jeśli przetwarzanie obejmuje wydrukowanie wiersza (np. pPolecenie sed ), to zostanie wydrukowane dwukrotnie (raz podczas przetwarzania, a następnie ponownie przez automatyczny wydruk po przetworzeniu). Ta -nopcja wyłącza automatyczne drukowanie, co oznacza, że ​​linie, które nie mają być drukowane, nie zostaną wydrukowane, a linie, które wyraźnie każą drukować (np. Za pomocą p), zostaną wydrukowane tylko raz.

  • sed -n '2,3p' test.txt - drukuje tylko linie od 2 do 3, zgodnie z żądaniem

  • sed '2,3p' test.txt - drukuje każdą linię (automatycznie), ORAZ TAKŻE drukuje linie 2-3 po raz drugi

  • sed -n 's/t/T/' test.txt - zamienia „t” na „T” w każdym wierszu, ale nie drukuje wyniku z powodu -n

  • sed 's/t/T/' test.txt - zamienia „t” na „T” w każdej linii i automatycznie drukuje wynik

I dodam jeszcze kilka przykładów:

  • sed -n 's/t/T/p' test.txt - zamienia „t” na „T” w każdej linii, drukuje TYLKO linie, w których nastąpiła zamiana (tj. nie „druga”)

  • sed 's/t/T/p' test.txt - zamienia „t” na „T” w każdej linii, drukuje linie, w których nastąpiła zamiana, a następnie automatycznie drukuje każdą linię (wynik: „druga” jest drukowana raz, wszystkie pozostałe dwa razy)

  • sed '2,3p; 3p' test.txt- drukuje wiersze 1, 4 i 5 raz (automatyczne drukowanie); wiersz 2 dwa razy (pierwsze ppolecenie, a następnie automatyczne drukowanie) i wiersz 3 trzy razy (raz dla każdego ppolecenia, a następnie ponownie automatycznie).

Gordon Davisson
źródło
Dziękuję, Gordon, ale twoja ocena tylko powtarza moją obserwację. W pierwszych dwóch przykładach nie -nwydrukowano każdej linii oprócz tych, które zostały specjalnie zamówione. Zatem w takim przypadku -n pomija drukowanie każdej przeanalizowanej linii . Jednak w trzecim i czwartym przykładzie zachowanie jest inne. W takich przypadkach -nfunkcja sed bez nie wysyła wierszy dwa razy, dlatego użycie -nnie wstrzymuje drukowania każdej przeanalizowanej linii, ale raczej wstrzymuje drukowanie niezmienionych linii . Mam trudności z uogólnieniem, kiedy zachowanie będzie jedno lub drugie.
dotancohen
Nie, w obu przypadkach -nrobi dokładnie to samo: przejście z każdej linii, która jest automatycznie drukowana (a modyfikator pi pna komendę zastępczą powodują dodatkowe drukowanie linii) do trybu, w którym linie są drukowane tylko wtedy, gdy wyraźnie to powiesz do (za pomocą ppolecenia itp.).
Gordon Davisson
Mówiąc inaczej: spróbuj dodać -nopcję ORAZ RÓWNIEŻ dodając ; pdo polecenia sed (np. sed -n '2,3p; p'Uzyskasz takie same wyniki, jak bez nich. -nPomija domyślny automatyczny wydruk, a ; pdodaje wyraźne (w większości równoważne) ) druk
Gordon Davisson
Teraz widzę, dziękuję. Jestem bardzo wdzięczny za poświęcenie czasu na wyjaśnienie przykładu. Miłego tygodnia!
dotancohen