アップデート#2: オプションについて大きな誤解をしていました-p
が、引数として提供されたすべてのファイルを処理するために使用されることは明らかですが、 からの入力を読み取るときにこれが必要な理由はまだよくわかりませんstdin
。
アップデート#1-p
:デフォルトの区切り文字 (改行文字) を使用している場合や入力ファイルが 1 行の場合でも、このオプションは常に必要であることに気づきました(少なくとも置換を実行する場合)。また-p
、1 行を処理するオプションを削除すると (適切な方法であると思われます)、すべてが壊れる (つまり、出力されない) 理由がよくわかりません。
たとえば、実行すると期待どおりに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 がファイルを処理できないのはなぜでしょうか。または、ファイルが 1 回だけ処理されるにもかかわらず、コマンドの各行にループを配置するように 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"