## jeder Zeile in einer Textdatei voranstellen

30

Ich möchte allen Zeilen in einer normalen Textdatei Hashes hinzufügen. Ich kann sowohl das Terminal als auch die grafische Benutzeroberfläche problemlos verwenden - ich muss es nur erledigen.

Oxwivi
quelle

Antworten:

50

Sie können seddazu Folgendes verwenden:

sed -i.bak 's/^/##/' file

Dies ersetzt den Zeilenanfang ( ^) durch ##.

Bearbeitet mit dem -i.bakSchalter seddie Datei direkt, erstellt jedoch eine Sicherungskopie mit der Erweiterung .bak.

Jukka Matilainen
quelle
1
+1 Dies ist das erste Mal, dass ich auf diese Sicherungsmethode stoße. Ich habe immer ein Inline direkt ersetzen: sed 's/^/##/' -i file. In diesem Fall wäre dies vorzuziehen, da es nicht schief gehen kann. In anderen Fällen kann dieser Befehl mit kombiniert werden diff -u file.bak file, um die Unterschiede zu sehen (ggf. weiterleiten less). Wenn bestätigt wird, dass es funktioniert, kann das Backup entfernt werden. Sonst könnte es mit einem einfachen restauriert werden mv file.bak file.
Lekensteyn
1
Elegant. Ich habe über so etwas nachgedacht sed 's/^\(.*\)$/##\1/', aber das ist viel schöner.
Ordnen Sie den
Nizza .. Ich dachte darüber nach, Vim vorzuschlagen, dies zu tun ...
Sathish
Dies hat mir geholfen, eine Blocklistendatei zu konvertieren :) Vielen Dank 1+
Neil
8

Hier ist eine Lösung für dieses Problem mit Perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
quelle
2
Der -pSchalter ist auch nützlich: perl -pe 's/^/##/' infile > outfile. (Es gibt auch den -i[extension]Schalter zum Ersetzen der Zieldatei an Ort und Stelle.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Jukka Matilainen
6

Während wir dabei sind:

gawk -i inplace '{print "##"$0}' infile

Dies verwendet das (vergleichsweise neue) Inplace-Bearbeitungs-Plugin für GNU awk 4.1.0+.

muru
quelle
4

Hier ist ein bashWeg:

while read -r; do printf '##%s\n' "$REPLY"; done < infile > outfile

( In der bashShellread -r funktioniert die Ausführung ohne andere Argumente wie folgt IFS= read -r REPLY.)

Dies ist stilistisch inspiriert von der Perl-Lösung von beav_35, die , wie ich zugeben muss, bei großen Dateien viel schneller ausgeführt wird, da perlzu erwarten ist, dass sie bei der Textverarbeitung effizienter ist als eine Shell.

Eliah Kagan
quelle
3

sed -iist kein POSIX-Standard. Wenn Sie also Purist sind, sollten Sie Folgendes verwenden ed:

printf ",s/^/##/\nw\nq" | ed -s file.txt
fkraiem
quelle
3

Hier ist ein einfacher perlWeg als anderswo vorgestellt:

perl -pi -e 'print "##"' YOURFILEHERE

Dies (ab) verwendet die Tatsache, dass perl -pdie Zeile nach Ausführung des in angegebenen Befehls gedruckt wird -e.

abligh
quelle
0

Sie können Vim im Ex-Modus verwenden:

ex -sc '%s/^/##/|x' file
  1. % Wählen Sie alle Zeilen aus

  2. s Ersatz

  3. x speichern und schließen

Steven Penny
quelle
0

Kann mit der Mapping-Funktion von Python und der Umleitung von stdin durchgeführt werden:

$ cat input.txt                                                                                                          
lorem ipsum
quick brown fox
hello world
$ python -c 'import sys;print "".join(map(lambda x: "##"+x,sys.stdin.readlines()))'  < input.txt                         
##lorem ipsum
##quick brown fox
##hello world

Speichern Sie die Ausgabe in einer neuen Datei und verwenden Sie sie anstelle der Originaldatei

Sergiy Kolodyazhnyy
quelle