Was ist der einfachste Weg, von der Befehlszeile aus am Anfang jeder Zeile der Datei eine Zeichenfolge hinzuzufügen?

Was ist der einfachste Weg, von der Befehlszeile aus am Anfang jeder Zeile der Datei eine Zeichenfolge hinzuzufügen?

Ich suche nach einer Möglichkeit, am Anfang jeder Zeile eine Zeichenfolge hinzuzufügen (dieselbe Zeichenfolge für jede Zeile). Nichts Anpassbares, sondern etwas, das leicht zu merken ist und auf jeder POSIX-kompatiblen Plattform (und auch jeder Shell) verfügbar ist.

Antwort1

:|paste -d'foo ' - - - - input > output

(nur ein Scherz, aber Sie werden wahrscheinlich feststellen, dass es die schnellste aller hier geposteten Lösungen ist :-b).

Der kanonische Weg ist:

sed 's/^/foo /' < input > output

Es lässt sich jedoch nicht einfach an beliebige Zeichenfolgen anpassen. Zum Beispiel

sed "s/^/$var /"

Funktioniert nur, wenn $varweder , , noch Zeilenumbruchzeichen enthalten sind &, \und /stellt eine Sicherheitslücke bei der Ausführung beliebiger Befehle in GNU sed dar, zumindest wenn dies nicht garantiert werden kann.

In jener Hinsicht,

export var
awk '{print ENVIRON["var"], $0}'

oder

perl -pe '$_="$ENV{var} $_"'

würde besser funktionieren.

Antwort2

Sie können Folgendes verwenden sed:

sed -i 's/^/your_string /' your_file

Dank der Kommentare von Stephane und Marco ist zu beachten, dass die -iOption nicht POSIX ist. Eine POSIX-Methode für das oben genannte wäre

sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file

oder perl:

perl -pi -e 's/^/your_string /' your_file

Erläuterung

Beide Befehle führen eine Regex-Ersetzung durch, indem sie den Zeilenanfang ( ^) durch die gewünschte Zeichenfolge ersetzen. Der -iSchalter in beiden Befehlen stellt sicher, dass die Datei an Ort und Stelle bearbeitet wird (d. h. die Änderungen werden in der Datei widergespiegelt und nicht auf stdout gedruckt).

sedsollte auf jedem POSIX-kompatiblen Betriebssystem verfügbar sein und perlauf den meisten modernen Unix-Systemen, außer vielleicht auf denen, diehaben sich die Mühe gemachtes zu entfernen.

Antwort3

Ich stelle eine Lösung vor, bei der awkdie Zeichenfolge „foo“ vorangestellt wird.

awk '{ print "foo", $0; }' input > output

awkist plattformübergreifend und auf jedem POSIX-System verfügbar. Es führt keine direkte Bearbeitung durch. Wenn Sie eine Datei bearbeiten möchten, ohne eine zweite zu erstellen, müssen Sie eine temporäre Datei verwenden. Siehe Josephs sedAntwort, sie zeigt die Syntax. Ein weiterer Hack besteht darin, die folgende Syntax zu verwenden, die im Wesentlichen eine temporäre Datei mit demselben Dateinamen wie die Originaldatei erstellt.

{ rm file; awk '{ print "foo", $0 }' > file; } < file

Antwort4

Sie können perlhierfür Folgendes verwenden:

$ perl -pi -e 's/^/mystring /' afile.txt

Beispiel

Erstellen Sie eine Beispieldatei.

$ seq 5 > afile.txt

$ cat afile.txt
1
2
3
4
5

Führen Sie den obigen Befehl aus:

$ perl -pi -e 's/^/mystring /' afile.txt

$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5

verwandte Informationen