Обновление №2: У меня было большое недопонимание по поводу этой -p
опции, теперь мне ясно, что она используется для обработки всех файлов, предоставленных в качестве аргумента, но я все еще не совсем понимаю, зачем это нужно при чтении входных данных из stdin
.
Обновление №1: Я заметил, что эта -p
опция всегда необходима (по крайней мере, при выполнении подстановки), даже при использовании разделителя по умолчанию (символа новой строки) и когда входной файл представляет собой одну строку, и я не совсем понимаю, почему отказ от опции -p
обработки одной строки (что, кажется, является чем-то подходящим) ломает все (т. е. не выводит никаких данных).
Например, запуск echo -n 'test' | perl -pe 's/test/newstring/'
выводит newstring
ожидаемые данные, но echo -n 'test' | perl -e 's/test/newstring/'
не выводит ничего.
Исходный вопрос:
Почему для чтения всего файла stdin
командой Perl (например perl -0777 -e [...]
, ) все равно требуется -p
указать опцию для фактической обработки файла (например, perl -0777 -pe [...]
)?
Я понимаю, что -p
опция помещает цикл вокруг каждой строки команды, но почему недостаточно изменить (в данном случае удалить) разделитель, чтобы Perl обработал файл? Или почему необходимо, несмотря на то, что файл будет обработан только один раз, указать Perl поместить цикл вокруг каждой строки команды?
решение1
Команда perl --help
утверждает, что -p assumes a loop like -n but prints line also, like sed
. sed
— это потоковый редактор, который используется для обработки текста во многом подобно тому, как -p
работает опция с perl
. -p
— единственная опция для perl
печати обработанного вывода. Без опции -p
обработанный вывод не может быть напечатан. Поэтому, как показано в моем примере ниже, если печать не происходит, строка не заменяется.
ВНИМАНИЕ: НЕ ЗАМЕНЯЙТЕ НА, -p
ПОСКОЛЬКУ -n
ЭТО УБЕРЕТ ВАШ ФАЙЛ!
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nosplash"
~$ sudo perl -pi -e 's/nosplash/splash/' /etc/default/grub
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"
~$ sudo perl -i -e 's/splash/nosplash/' /etc/default/grub
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"