更新 #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"