Wie füge ich Text an den Anfang und das Ende mehrerer Textdateien in Bash an?

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ügt HEAD Text in die erste Zeile am Zeilenanfang ein
  • $s/$/TAIL/ – fügt TAIL 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 (*) mit foo Erweiterung, verwenden Sie **/*.foo für die Rekursivität (nach Aktivierung von globstar: shopt -s globstar)

Kommentare

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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.