Що робить опція `-n` в sed?


13

Це запис чоловічої сторінки для -n:

придушити автоматичний друк простору візерунка

Я помічаю, що, коли не використовується -nдля певних операцій, кожен рядок друкується до stdout (а запитувані рядки друкуються двічі):

$ 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

Однак цей закон не застосовується до інших команд:

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

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

То що ж -nробити саме?

Відповіді:


17

Зазвичай sed обробляє кожен рядок (робить заміну тощо), після чого друкує результат. Якщо обробка включає в себе рядок, що друкується (наприклад, pкоманда sed ), то він надрукується двічі (один раз під час обробки, потім знову шляхом автоматичного друку після обробки). Ця -nопція вимикає автоматичну друк, а це означає, що рядки, які ви спеціально не кажете їй для друку, не надрукуються, а рядки, які ви явно говорите, друкуються (наприклад, з p), надрукуються лише один раз.

  • sed -n '2,3p' test.txt - друкує лише рядки 2 - 3, як вимагається

  • sed '2,3p' test.txt - друкує кожен рядок (автоматично), А також друкує рядки 2-3 секунди

  • sed -n 's/t/T/' test.txt - замінює "t" на "T" у кожному рядку, але не друкує результат через -n

  • sed 's/t/T/' test.txt - замінює "t" на "T" у кожному рядку та автоматично друкує результат

І дозвольте додати ще кілька прикладів:

  • sed -n 's/t/T/p' test.txt - замінює "t" на "T" у кожному рядку, друкує ТІЛЬКИ рядки, де відбулася заміна (тобто не "друга")

  • sed 's/t/T/p' test.txt - замінює "t" на "T" на кожному рядку, друкує рядки, де відбулася заміна, потім автоматично друкує кожен рядок (результат: "другий" друкується один раз, всі інші двічі)

  • sed '2,3p; 3p' test.txt- друкує один раз рядки 1, 4 та 5 (автоматичний друк); рядок 2 двічі (перша pкоманда, потім автоматичний друк), а рядок 3 - три рази (один раз для кожної pкоманди, потім знову автоматично).


Дякую Гордон, але ваша оцінка лише повторює моє спостереження. У перших двох прикладах sed без -nдруку видає кожен рядок на додаток до запитуваних рядків. Таким чином, у такому випадку -n пригнічується друк кожного розібраного рядка . Однак у третьому та четвертому прикладах поведінка відрізняється. У цих випадках sed без -nне виводить рядки двічі, таким чином, використання -nне пригнічує друк кожного проаналізованого рядка, а швидше пригнічує друк рядків, які не були змінені . Мені важко узагальнити, коли поведінка буде тим чи іншим.
dotancohen

Ні, в обох випадках -nробить одне і те ж: перехід від кожного рядка бути автоматично роздруковується (а pі pмодифікатор команди замінника причини лінії повинні бути надруковані додаткові раз) в режим , в якому рядки друкуються тільки якщо конкретно сказати йому до (з pкомандою тощо).
Гордон Девіссон

Поставте це ще одним способом: спробуйте додати -nопцію ТА ТАКОЖ додавання ; pдо команди sed (наприклад sed -n '2,3p; p', і ви отримаєте ті ж результати, що і без жодного. -nПридушує автоматичну друк за замовчуванням, а ; pдодавання явного (здебільшого еквівалентного) ) друк.
Гордон Девіссон

Я бачу зараз, дякую. Я дуже вдячний за те, що ви знайшли час, щоб зробити зрозумілий приклад. Приємного тижня!
dotancohen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.