ein einzeiliger awk-Befehl sollte auch ausreichen:
awk '{print "prefix" $0}' file
Die gesamte Schleife kann durch einen einzigen sed-Befehl ersetzt werden, der auf die gesamte Datei wirkt:
sed -e 's/^/prefix/' $file
Bezüglich Ihres ursprünglichen Fehlers:
./appendToFile.sh:Zeile 11:/bin/sed:Argumentliste zu lang
Das Problem liegt in dieser Codezeile:
sed -e 's/^/prefix/' $line
$line
in diesem Zusammenhang ist Dateiname das sed läuft dagegen. Um Ihren Code zu korrigieren, sollten Sie diese Zeile wie folgt korrigieren:
echo $line | sed -e 's/^/prefix/'
(Beachten Sie auch, dass Ihr ursprünglicher Code nicht die < $file
enthalten sollte am Ende.)
William Pursell spricht dieses Problem in seinen beiden Vorschlägen korrekt an.
Ich glaube jedoch, dass Sie richtig festgestellt haben, dass es ein Problem mit Ihrer ursprünglichen Textdatei gibt. dos2unix
wird dieses Problem nicht beheben, da es nur die Wagenrücklauf-Windows-Sticks am Zeilenende entfernt. (Wenn Sie jedoch versuchen, eine Linux-Datei in Windows zu lesen, erhalten Sie eine Mammutzeile ohne Rückgabewerte.)
Unter der Annahme, dass es kein Problem mit den Zeilenendezeichen in Ihrer Textdatei gibt, funktionieren die Antworten von William Pursell, Andy Lester oder nullrevolution.
Eine Variation der while read...
Vorschlag:
while read -r line; do echo "PREFIX " $line; done < $file
Dies könnte direkt von der Shell ausgeführt werden (keine Notwendigkeit für eine Batch-/Skriptdatei):
while read -r line; do echo "kp" $line; done < stusers.txt
Ein Perl-Weg wäre:
perl -p -e's/^/prefix' filename
oder
perl -p -e'$_ = "prefix $_"' filename
In beiden Fällen lautet das ab filename
und druckt die vorangestellten Zeilen nach STDOUT.
Wenn Sie einen -i
hinzufügen Flag, dann ändert Perl die Datei an Ort und Stelle. Sie können auch mehrere Dateinamen angeben, und Perl erledigt sie wie von Zauberhand alle.