Ich muss PHP-Tags hinzufügen, die eine Datei umgeben. Es ist einfach, sie mit anzuhängen
find . -exec echo "?>" >> '{}' \;
aber wie kann ich den tag voranstellen<?php ?
Ich muss PHP-Tags hinzufügen, die eine Datei umgeben. Es ist einfach, sie mit anzuhängen
find . -exec echo "?>" >> '{}' \;
aber wie kann ich den tag voranstellen<?php ?
Antworten:
sed -i "1s/^/<?php /" file
(Die -iist für die direkte Bearbeitung.)
Weitere portable Version:
ed file <<!
1s/^/<?php /
wq
!
sed, und es erlaubt das Hinzufügen eines Backup-Suffix.
-iist nicht portierbar, die Syntax unterscheidet sich zwischen den Implementierungen und es werden Symlinks unterbrochen. Sie sollten eine Anwendung verwenden, die eigentlich zum Bearbeiten von Dateien entwickelt wurde.
Ich kann noch keinen Kommentar hinterlassen, aber alles in einem Schritt erledigen:
find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
Das können Sie mit einem Perl-Einzeiler machen:
perl -0777 -p -i -e "s/^/hey /g" testfile
Der -0777erzwingt das Schlürfen von Dateien, sodass die gesamte Datei als eine Zeile gelesen wird. -paktiviert das Looping. -iAktiviert die direkte Bearbeitung der Datei. ^gibt den Anfang einer Zeile an.
$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf
Update: Wie in den Kommentaren angegeben, können Sie festlegen, dass -i.bakanstelle von automatisch ein Backup erstellt wird -i. Dies bietet zusätzliche Sicherheit bei Fehlern in Ihrem Befehl. Das Argument to -i wird zum Suffix der Sicherung.
Wenn Sie eine Reihe von Dateien aktualisieren, können Sie den Befehl mit ausführen -i.backup${RANDOM}, prüfen, ob alle Dateien korrekt aktualisiert wurden, und dann alle Dateien mit dieser Erweiterung entfernen.
-iFlagge ohne Suffix empfehlen , warnen Sie bitte die Leser, dass dies bedeutet, dass Sie keine Sicherung erhalten . Für ein paar Zeichen mehr ( -i.bak) erhalten Sie eine Sicherungskopie, falls Ihr Einzeiler einen Tippfehler enthält. Ein ziemlich einfacher Tippfehler (z. B. das Vergessen der -pFlagge) kann sonst den ganzen Tag ruinieren.
seddient zum Bearbeiten von Streams - eine Datei ist kein Stream. Verwenden Sie ein Programm wie edoder , das für diesen Zweck vorgesehen ist ex. Die -iOption to sedist nicht nur nicht portierbar, sondern unterbricht auch alle möglicherweise auftretenden Symlinks, da sie im Wesentlichen gelöscht und neu erstellt werden, was sinnlos ist.
for file in foo bar baz; do
ed -s "${file}" << EOF
0a
<?php
.
w
EOF
done
eddas macht, geben Sie dies in Ihrer Antwort an.
Eine Alternative zu dem, was Sie geschrieben haben, um am Ende jeder Datei im Verzeichnis (in bash) etwas hinzuzufügen :
for FNAME in *
do
echo "?>" >> $FNAME
done
obwohl ich deinen Einzeiler mag find:)
$FNAMEsollte laut $fnameKonvention sein, dass wir Umgebungsvariablen (PAGER, EDITOR, SHELL, ...) und interne Shell-Variablen (BASH_VERSION, RANDOM, ...) großschreiben. Alle anderen Variablennamen sollten mindestens einen Kleinbuchstaben enthalten. Diese Konvention vermeidet das versehentliche Überschreiben von Umgebungsvariablen und internen Variablen.
Da ist der einfache Weg
echo "startstr$(cat filename)endstring" > filename.new