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