Ich habe eine Datei wie folgt:
line1
line2
line3
Und ich möchte bekommen:
prefixline1
prefixline2
prefixline3
Ich könnte ein Ruby-Skript schreiben, aber es ist besser, wenn ich es nicht brauche.
prefix
wird enthalten /
. Es ist /opt/workdir/
zum Beispiel ein Weg .
linux
scripting
text-processing
pierrotlefou
quelle
quelle
sed
leichte Aufgaben wie diese. Wenn "Präfix" bekannt ist, ist es sehr einfach, ein Zeichen auszuwählen, das nicht aus "Präfix" stammt.sed
in einer Pipeline verwenden können, zfoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
dergleichen\/
(in Zeichenfolgen in einfachen Anführungszeichen) oder\\/
(in Zeichenfolgen in doppelten Anführungszeichen)sed -e 's/$/postfix/' file
Sie diese Option, wenn Sie am Ende jeder Zeile eine Zeichenfolge hinzufügen möchten.Mit Perl (Ersatz an Ort und Stelle):
quelle
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
berichtetawk: out of memory in readrec 1 source line number 1
, aber die Lösung mitsed
erfolgreich abgeschlossen.Sie können Vim im Ex-Modus verwenden:
%
Wählen Sie alle Zeilen auss
ersetzenx
speichern und schließenquelle
:%s/^/prefix/
, da diese Strategie in vielen Situationen nützlich istWenn Ihr Präfix etwas kompliziert ist, geben Sie es einfach in eine Variable ein:
Dann übergeben Sie diese Variable und lassen awk damit umgehen:
quelle
Wenn Sie Perl haben:
quelle
Verwenden der Shell:
quelle
Hier ist eine gut lesbare Oneliner-Lösung mit dem
ts
Befehl von moreutilsUnd wie es Schritt für Schritt abgeleitet wird:
quelle
Obwohl ich nicht glaube, dass pierr dieses Problem hatte, brauchte ich eine Lösung, die die Ausgabe vom Live- "Tail" einer Datei nicht verzögert, da ich mehrere Warnprotokolle gleichzeitig überwachen und jeder Zeile den Namen des jeweiligen Protokolls voranstellen wollte .
Leider haben sed, cut usw. zu viel Pufferung eingeführt und mich davon abgehalten, die aktuellsten Zeilen zu sehen. Steven Pennys Vorschlag, die
-s
Option von zu verwenden,nl
war faszinierend, und Tests haben gezeigt, dass die unerwünschte Pufferung, die mich beschäftigte, nicht eingeführt wurde.Es gab jedoch einige Probleme bei der Verwendung
nl
, die mit dem Wunsch zusammenhängen, die unerwünschten Zeilennummern zu entfernen (selbst wenn Sie sich nicht für die Ästhetik interessieren, kann es Fälle geben, in denen die Verwendung der zusätzlichen Spalten unerwünscht wäre). Erstens führt die Verwendung von "Ausschneiden" zum Entfernen der Zahlen das Pufferproblem erneut ein, sodass die Lösung zerstört wird. Zweitens hilft die Verwendung von "-w1" nicht, da dies die Zeilennummer NICHT auf eine einzelne Spalte beschränkt - sie wird nur breiter, wenn mehr Ziffern benötigt werden.Es ist nicht schön, wenn Sie dies an anderer Stelle erfassen möchten, aber da ich genau das nicht tun musste (alles wurde bereits in Protokolldateien geschrieben, ich wollte nur mehrere gleichzeitig in Echtzeit ansehen), das Beste Um die Zeilennummern zu verlieren und nur mein Präfix zu haben, begann der
-s
String mit einem Wagenrücklauf (CR oder ^ M oder Strg-M). Also zum Beispiel:quelle
-u
Option zum Sedieren, um die Pufferung zu vermeiden.Verwenden von ed:
Dies ersetzt für jede Zeile (
,
) den Anfang der Zeile (^
) durchprefix
.wq
speichert und beendet.Wenn die Ersatzzeichenfolge einen Schrägstrich enthält, können wir
s
stattdessen ein anderes Trennzeichen verwenden für :Ich habe das Here-Doc-Trennzeichen
EOE
("end of ed") zitiert , um eine Parametererweiterung zu verhindern. In diesem Beispiel würde es auch ohne Anführungszeichen funktionieren, aber es wird empfohlen, Überraschungen zu vermeiden, wenn Sie jemals eine$
in Ihrem ed-Skript haben.quelle
Verwenden von & (der gesamte Teil der Eingabe, der mit dem Muster übereinstimmt ”):
ODER mit Rückverweisen:
quelle
Sie können dies auch mit der Rückreferenztechnik erreichen
Sie können auch mit awk wie diesem verwenden
quelle
Hier ist ein abgeschlossenes Beispiel, das den
sed
Ansatz dieser Antwort verwendet :prefix_lines
quelle
PREFIX
spezielle Zeichen für sed wie einen Schrägstrich enthält.prefix_lines \*
Für Leute auf BSD / OSX-Systemen gibt es ein Hilfsprogramm
lam
, kurz für Laminat.lam -s prefix file
wird tun was du willst. Ich benutze es in Pipelines, zB:find -type f -exec lam -s "{}: " "{}" \; | fzf
... die alle Dateien finden, jede auf ihnen ausführen und jeder Datei ein Präfix mit einem eigenen Dateinamen geben. (Und pumpen Sie den Ausgang zur Suche nach fzf.)
quelle