Почему sed замена управляет с флагом p, печатают измененный вывод дважды?

Мой a.txt имеет, содержит следующее:

apple
123
pear
1234

Если я выполняю эту команду ниже,

sed 's/123/AAA/p' a.txt

Я думал, что доберусь

apple
123
AAA
pear
1234
AAA4

потому что sed автоматически печатает каждую строку по умолчанию. И я ожидал свой измененный вывод после этого, который был изменен в пространстве шаблона. Но моя эффективная выходная мощность печатает замену дважды:

apple
AAA
AAA
pear
AAA4
AAA4

Почему это?

3
задан 1 February 2017 в 07:32

1 ответ

sed 's/123/AAA/p' a.txt

Это выражение содержит две команды

  • s/123/AAA/ означает, найти строки с 123 и заменить 123 на AAA в его первом случае в этих строках. где это происходит. По умолчанию sed печатает каждую строку, поэтому весь поток печатается с модификациями

    ,
  • ,
  • ,

    , p - печатать пространство шаблона. В точке, где мы называем p, пространство шаблонов содержит измененные строки, поэтому они печатаются снова.

Комбинация s и p обычно используется с -n, когда мы хотим напечатать только те строки потока, которые были найдены s и, следовательно, изменены.

Порядок команд имеет значение. В вашей команде, если вы поставите p первым, он напечатает немодифицированный поток, близкий к тому, что вы ожидали:

$ sed 'ps/123/AAA/' a.txt
apple
apple
123
AAA
pear
pear
1234
AAA4

Здесь, когда мы вызываем p, пространство шаблона - это весь файл, потому что мы не указали какую-либо его часть, и она не была изменена. Команда s также печатает весь файл, но также изменяет его, поэтому мы видим поток дважды, измененный и неизмененный.

Так что, возможно, полезно думать, что команды в выражении sed применяются кумулятивно слева направо, и, как сказал Steeldriver, вывод, который вы получите в этом случае, происходит из-за применения p в конце цикл, после того как s был использован для выбора и изменения части файла.

7
ответ дан 1 December 2019 в 13:23

Другие вопросы по тегам:

Похожие вопросы: