Wie kann ich dem Anfang mehrerer Dateien ein Tag voranstellen?


18

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:


18
sed -i "1s/^/<?php /" file

(Die -iist für die direkte Bearbeitung.)

Weitere portable Version:

ed file <<!
1s/^/<?php /
wq
!

Nifty - das ist ein bisschen einfacher als das, was ich beschreiben wollte :)
Warren

Ich muss die Erweiterung zum Argument -i hier hinzufügen. Benutzt du sed oder GNU sed?

Richard: Der, den ich benutze, behauptet, GNU zu sein sed, und es erlaubt das Hinzufügen eines Backup-Suffix.
Grawity

2
Ich verwende BSD sed und es ermöglicht das direkte Bearbeiten, aber ich muss es erweitern. dh 'sed -i .bak "PATTERN" -Datei'

3
-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.
Chris Down

5

Sie könnten einen AWKFilter wie diesen verwenden,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; sonst $ 0 ausgeben} 'testfile> newfile

Wo PREFIXist dein PHP-Präfix?


5

Ich kann noch keinen Kommentar hinterlassen, aber alles in einem Schritt erledigen:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

Liebe es, hat mir Stunden gespart.
Steve Hill

5

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.


1
"Der Wert 0777 führt dazu, dass Perl Dateien vollständig schlürft, da es kein zulässiges Byte mit diesem Wert gibt" siehe sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea

1
Wenn Sie die Verwendung der -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.
Telemachus

@ Telemachus - Einverstanden. Aktualisiert.

4

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

Was Sie vorgestellt haben, ist eine grundlegende Möglichkeit, eine einzelne Datei zu bearbeiten. Dies scheint das Problem nicht zu beantworten - die Frage betrifft das Ändern einer Reihe von Dateien (obwohl dies auf den ersten Blick möglicherweise nicht offensichtlich ist). Wenn Sie wissen, wie man eddas macht, geben Sie dies in Ihrer Antwort an.
Rozcietrzewiacz

@rozcietrzewiacz - Da Grawity die gleiche Methode zum Bearbeiten einer einzelnen Datei demonstrierte (die akzeptiert wurde), hielt ich es für angemessen für die Antwort. In beiden Fällen setze ich es in eine for-Schleife, die Ihre Bedenken lindern sollte.
Chris Down

0

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.
Chris Down

@ Chris unten - die Konvention ich meine ganze Karriere gesehen habe durch Einstellung variiert: Kleinschreibung , Großschreibung und Camelcase :)
warren

Camelcase und Kleinbuchstaben sind in Ordnung. In beiden Fällen sollten Variablen, die keine Umgebungsvariablen sind, nicht in Großbuchstaben geschrieben werden.
Chris Down

0

Da ist der einfache Weg

echo "startstr$(cat filename)endstring" > filename.new

Dies wird mit nachfolgenden Zeilenumbrüchen unterbrochen.
Chris Down

@ ChrisDown nachgestellte Zeilenumbrüche in der Datei?
Hogan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.