Aktualisierung Nr. 2: Ich hatte ein großes Missverständnis bezüglich der -p
Option, jetzt ist mir klar, dass sie verwendet wird, um alle als Argument angegebenen Dateien zu verarbeiten, aber ich verstehe immer noch nicht ganz, warum dies beim Lesen der Eingabe von erforderlich ist stdin
.
Aktualisierung Nr. 1: Mir ist aufgefallen, dass die -p
Option immer erforderlich ist (zumindest beim Durchführen einer Ersetzung), selbst wenn das Standardtrennzeichen (Neuzeilenzeichen) verwendet wird und die Eingabedatei nur eine Zeile umfasst. Ich verstehe nicht ganz, warum das Weglassen der -p
Option zum Verarbeiten einer einzelnen Zeile (was angemessen erscheint) alles kaputt macht (d. h. keine Ausgabe erfolgt).
Beispielsweise wird beim Ausführen die erwartete echo -n 'test' | perl -pe 's/test/newstring/'
Ausgabe ausgegeben, es wird jedoch nichts ausgegeben.newstring
echo -n 'test' | perl -e 's/test/newstring/'
Ursprüngliche Frage:
Warum muss beim „Slurping“ der gesamten Datei, aus stdin
der in einem Perl-Befehl gelesen wird (z. B. perl -0777 -e [...]
), immer noch die -p
Option angegeben werden, um die Datei tatsächlich verarbeiten zu können (z. B. perl -0777 -pe [...]
)?
Ich verstehe, dass die -p
Option eine Schleife um jede Zeile des Befehls legt, aber warum reicht es nicht aus, das Trennzeichen zu ändern (in diesem Fall zu entfernen), damit Perl die Datei verarbeiten kann? Oder warum ist es trotz der Tatsache, dass die Datei nur einmal verarbeitet wird, notwendig, Perl anzuweisen, eine Schleife um jede Zeile des Befehls zu legen?
Antwort1
Der perl --help
Befehl besagt, dass -p assumes a loop like -n but prints line also, like sed
. sed
ein Stream-Editor ist und zum Bearbeiten von Text verwendet wird, ähnlich wie die -p
Option mit perl
. funktioniert. -p
Dies ist die einzige Option zum perl
Drucken der verarbeiteten Ausgabe. Ohne die -p
Option kann die verarbeitete Ausgabe nicht gedruckt werden. Wie in meinem Beispiel unten gezeigt, wird die Zeichenfolge nicht ersetzt, wenn der Ausdruck nicht erfolgt.
WARNUNG: ERSETZEN SIE DAS -p
NICHT DURCH -n
, DA IHRE DATEI DADURCH GELÖSCHT WIRD!
~$ 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"