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 -i
ist für die direkte Bearbeitung.)
Weitere portable Version:
ed file <<!
1s/^/<?php /
wq
!
sed
, und es erlaubt das Hinzufügen eines Backup-Suffix.
-i
ist 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 -0777
erzwingt das Schlürfen von Dateien, sodass die gesamte Datei als eine Zeile gelesen wird. -p
aktiviert das Looping. -i
Aktiviert 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.bak
anstelle 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.
-i
Flagge 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 -p
Flagge) kann sonst den ganzen Tag ruinieren.
sed
dient zum Bearbeiten von Streams - eine Datei ist kein Stream. Verwenden Sie ein Programm wie ed
oder , das für diesen Zweck vorgesehen ist ex
. Die -i
Option to sed
ist 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
ed
das 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
:)
$FNAME
sollte laut $fname
Konvention 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