Ich habe ein Verzeichnis voller Textdateien. Mein Ziel ist es, Text an den Anfang und das Ende von allen anzuhängen. Der Text am Anfang und am Ende ist für jede Datei gleich.
Basierend auf dem Code, den ich aus dem Web erhalten habe, ist dies der Code zum Anhängen an den Anfang der Datei:
echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt
Dies ist der Code zum Anhängen an das Ende der Datei. Das Ziel ist es, den Text };
am Ende jeder Datei hinzuzufügen:
echo "};" >> $BASEDIR/Translations/Javascript/*.txt
Die Beispiele, aus denen ich gezogen habe waren für die Bearbeitung einzelner Dateien. Ich dachte, ich würde versuchen, mit dem Platzhalter *.txt
auf mehrere Dateien zu reagieren.
Ich könnte auch andere Fehler machen. Wie kann ich das auf jeden Fall tun? Text an den Anfang und das Ende mehrerer Dateien anhängen?
Antwort
Zum Voranstellen von Text an eine Datei, die Sie verwenden können (mit dem GNU-Implementierung von sed
):
sed -i "1i some string" file
Das Anhängen von Text ist so einfach wie
echo "Some other string" >> file
Als letztes müssen Sie dies in eine Schleife einfügen, die alle Dateien durchläuft, die Sie bearbeiten möchten:
for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done
Antwort
Sie können GNU sed verwenden.
Wie bereits dargestellt, können Sie Textzeilen direkt vor und nach dem Abgleich einfügen Zeilen einer Datei mit dem Befehl sed
mit dem Befehl i
bzw. a
„Es wurde nicht gezeigt, dass Sie dies mit einem Einzeiler und für mehrere Dateien gleichzeitig.
Im Folgenden wird eine Zeile vor der ersten 1i
eingefügt und nach der letzten Zeile $a
. Die Einfügungen werden für alle Dateien ausgeführt, die dem Glob *.txt
entsprechen.
sed -i -e "1ivar language = {" -e "$a};" -- *.txt
Beide i
und a
funktionieren nicht nur mit Zeilennummern, sondern auch in jeder Zeile, die einem bestimmten Muster entspricht. Dies würde einen Kommentar einfügen, wenn eine Zeile var y = 2;
enthält:
sed -i -- "/var y = 2;/i//initialize variable y" *.js
Antwort
Vollständig POSIX-kompatibler Befehl mit ex
:
for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done
Wenn Sie den printf
-Teil des Befehls selbst ausführen, werden die genauen Bearbeitungsbefehle angezeigt wird an ex
übergeben:
0a var language = { . $a }; . x
0a
bedeutet „Anhängen“ Text nach Zeile 0 „(also vor der ersten Zeile). Die nächste Zeile ist der Literaltext, der nach Zeile 0 „angehängt“ werden soll. Der Punkt (.
) in einer Zeile selbst beendet den anzuhängenden Text.
$a
bedeutet, Text nach der letzten Zeile der Datei anzuhängen.
x
bedeutet, die Änderungen zu speichern und zu beenden .
Antwort
Hier ist eine Möglichkeit, dies in Perl zu tun:
for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done
Kommentare
- @St é phaneChazelas Hinzufügen von
-i
Anstelle dieser Dateisetzung funktioniert nicht , sondern wird nur nach Standard gedruckt. - @OlehPrypin, in der Tat Ihr Recht. Kommentar gelöscht.
Antwort
Hat auch das Recht zu sein (mit Ergebnissen in .out
-Dateien):
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \;
Eine weitere, ausführlichere Variante – Quelldateien werden durch Ergebnis ersetzt:
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print
Antwort
Versuchen Sie, ex
zu verwenden:
ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo
Dabei lauten die Befehle:
-
bufdo!
führt die folgenden Befehle für jeden geöffneten Puffer / jede geöffnete Datei aus (Hinweis: Es ist nicht POSIX ) -
1s/^/HEAD/
– fügtHEAD
Text in die erste Zeile am Zeilenanfang ein -
$s/$/TAIL/
– fügtTAIL
Text in die letzte Zeile am Ende der Zeile
und ein Argumente sind:
-
-s
– stiller / schneller Modus -
-cxa
– Speichern Sie alle geöffneten Puffer / Dateien und beenden Sie -
*.foo
– alle Dateien im aktuellen Verzeichnis (*
) mitfoo
Erweiterung, verwenden Sie**/*.foo
für die Rekursivität (nach Aktivierung von globstar:shopt -s globstar
)
Kommentare
- Hinweis Bufdo ist nicht POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny ist richtig. Ich verwende die von POSIX angegebenen Funktionen nur persönlich für Skriptänderungen.
Antwort
Verwenden Sie mit gnu awk
die inplace
Erweiterung und BEGINFILE
/ ENDFILE
:
gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt
Antwort
Perl-Einzeiler zur Rettung:
perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt