2012-11-27 11 views
13

Ich habe folgende bash-Code, der durch die Linie durch eine Textdatei, Linie Schleifen .. im zu jeder Zeile versucht, die Arbeit ‚Präfix‘ Präfix, sondern diese Störung erhalte:Wie kann ich eine Zeichenfolge an den Anfang jeder Zeile in einer Datei voranstellen?

[email protected]:~/Desktop$ ./appendToFile.sh stusers.txt kp 
stusers.txt 
kp 
./appendToFile.sh: line 11: /bin/sed: Argument list too long 
[email protected],passw0rd 

Dies ist die bash Skript ..

#!/bin/bash 

file=$1 
string=$2 

echo "$file" 
echo "$string" 

for line in `cat $file` 
do 
    sed -e 's/^/prefix/' $line 
    echo "$line" 
done < $file 

Was mache ich hier falsch?

Update: Performing Kopf auf Datei Dumps alle Zeilen auf eine einzige Zeile des Terminals, wahrscheinlich verwandt?

[email protected]:~/Desktop$ head stusers.txt 
[email protected]:~/Desktop$ ouse.com,passw0rd 
+2

Sie wahrscheinlich. Vielleicht möchten Sie 'dos2unix' –

+0

@WilliamPursell Ich versuchte Dos2unix gegen die Datei laufen aber nicht die neuen Zeilen für mich einfügen, einfachste Lösung war Dateiinhalt in eine neue Datei kopieren – bobbyrne01

Antwort

28

eine einzeilige awk auch den Trick tun sollten:

awk '{print "prefix" $0}' file 
+1

so einfach, liebe es! Ich habe gerade diese Befehlsausgabe in eine Datei umgeleitet .. Danke! – bobbyrne01

3

Statt der for-Schleife, ist es sinnvoller while read... zu verwenden:

while read -r line; do 
do 
    echo "$line" | sed -e 's/^/prefix/' 
done < $file 

Aber Sie würden mit dem einfacheren viel besser dran:

sed -e 's/^/prefix/' $file 
+0

der erste Code-Block hat die Datei mit den neuen Präfixe nicht aktualisiert und der zweite Block aktualisiert nur die erste Zeile der Datei – bobbyrne01

3

Ein Perl-Weg würde es sein:

perl -p -e's/^/prefix' filename 

oder

perl -p -e'$_ = "prefix $_"' filename 

In jedem Fall, dass die voran Linien auf STDOUT aus filename und druckt liest.

Wenn Sie ein -i Flag hinzufügen, wird Perl die Datei an Ort und Stelle ändern. Sie können auch mehrere Dateinamen angeben und Perl wird alle magisch tun.

0

Sie nicht sed benötigen, verketten nur die Strings in der echo-Befehl

while IFS= read -r line; do 
    echo "prefix$line" 
done < filename 

Ihre Schleife iteriert über jede Wort in der Datei:

for line in `cat file`; ... 
9

bezüglich y unsere ursprüngliche Fehler:

./appendToFile.sh: line 11: /bin/sed: Argument list too long

Das Problem ist mit dieser Codezeile:

sed -e 's/^/prefix/' $line

$ line in diesem Zusammenhang ist Dateiname dass sed läuft gegen. So korrigieren Sie den Code sollten Sie diese Zeile als solche beheben:

echo $line | sed -e 's/^/prefex/'

(Beachten Sie auch, dass Ihr Original-Code sollte nicht die < $file am Ende haben.)

William Pursell behandelt dieses Problem in seinen beiden Vorschlägen korrekt.

Allerdings glaube ich, dass Sie richtig erkannt haben, dass ein Problem mit Ihrer ursprünglichen Textdatei vorliegt. dos2unix wird dieses Problem nicht beheben, da es nur den Wagenrücklauf Windows-Sticks am Ende der Zeilen entfernt. (Wenn Sie jedoch eine Linux-Datei in Windows lesen, erhalten Sie eine Mammutlinie ohne Rückgabe.)

Angenommen, es ist kein Problem mit den Zeilenendenzeichen in Ihrer Textdatei, William Purpell's Die Antworten von Andy Lester oder nullrevolution werden funktionieren.

Eine Variation des while read... Vorschlag:

while read -r line; do echo "PREFIX " $line; done < $file

Das von der Shell direkt ausgeführt werden (keine Notwendigkeit für eine Batch/Script-Datei):

while read -r line; do echo "kp" $line; done < stusers.txt

+1

1) Schalten Sie die Feldaufteilung aus, so dass Sie keine führenden und Trailins leeren, und 2) zitieren Sie Ihre Variablen aus VIELEN Gründen: 'während IFS = read -r line; echo "kp" "$ line"; Fertig

6

Das gesamte Die Schleife kann durch einen einzelnen Befehl sed ersetzt werden, der für die gesamte Datei gilt:

sed -e 's/^/prefix/' $file 
+1

Ist es auch möglich zu überprüfen, ob die Leitung leer ist oder nicht? –

+0

Wollen Sie leere Zeilen leer lassen? – Jack

+1

Es ist so lange her ... Es wäre nive, beide Optionen zu kennen –

0

Verwendung sed. Ändern Sie einfach das Wort prefix.

sed -e 's/^/prefix/' file.ext 

Wenn Sie in der Datei ungültig Zeilenenden speichern wollen, müssen Sie die Ausgabe in einer anderen Datei

sed -e 's/^/prefix/' file.ext > file_new.ext 
Verwandte Themen