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 $var
weder , , 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 -i
Option 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 -i
Schalter 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).
sed
sollte auf jedem POSIX-kompatiblen Betriebssystem verfügbar sein und perl
auf 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 awk
die Zeichenfolge „foo“ vorangestellt wird.
awk '{ print "foo", $0; }' input > output
awk
ist 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 sed
Antwort, 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 perl
hierfü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