Что делает опция `-n` в sed?

13

Это страница справочной страницы для -n:

-n

подавить автоматическую печать пространства шаблона

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

$ 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делать?

dotancohen
источник

Ответы:

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происходит одно и то же: переключение с каждой автоматически печатаемой строки (а модификатор pand pна команду замены приводит к тому, что строка печатается дополнительное время) в режим, в котором строки печатаются только в том случае, если вы это специально указали (с помощью pкоманды и т. д.).
Гордон Дэвиссон
Иными словами, попробуйте добавить -nопцию И ТАКЖЕ добавив ; pк команде sed (например sed -n '2,3p; p', и вы получите те же результаты, что и без них. При этом -nподавляется автоматическая печать по умолчанию, а ; pдобавляется явный (в основном эквивалент ) печать.
Гордон Дэвиссон
Теперь я вижу, спасибо. Я очень признателен за то, что вы нашли время, чтобы сделать пример явным. Удачной недели!
dotancohen