Мой 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
Почему это?
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
был использован для выбора и изменения части файла.