it-swarm.com.de

Wie kann ich am Anfang jeder Zeile einer Datei einen String voranstellen?

Ich habe den folgenden bash-Code, der eine Textdatei durchläuft, Zeile für Zeile. Ich versuche, der Arbeit das Präfix jeder Zeile voranzustellen, stattdessen wird dieser Fehler angezeigt:

[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 das 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: Durch das Ausführen von Head-on-File werden alle Zeilen auf eine einzige Zeile des Terminals übertragen, wahrscheinlich verbunden?

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

ein einzeiliger awk-Befehl sollte den Trick auch tun:

awk '{print "prefix" $0}' file
37
nullrevolution

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 ist in diesem Zusammenhang Dateiname gegen die sed läuft. Um Ihren Code zu korrigieren, sollten Sie diese Zeile als solche festlegen:

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

(Beachten Sie auch, dass Ihr ursprünglicher Code am Ende keinen < $file enthalten sollte.)

William Pursell spricht dieses Problem in seinen beiden Vorschlägen richtig an.

Ich glaube jedoch, dass Sie richtig erkannt haben, dass ein Problem mit Ihrer ursprünglichen Textdatei vorliegt. dos2unix behebt dieses Problem nicht, da nur die Wagenrücklaufstreifen von Windows-Sticks am Zeilenende entfernt werden. (Wenn Sie jedoch versuchen, eine Linux-Datei in Windows zu lesen, erhalten Sie eine Mammutlinie ohne Rückgaben.)

Angenommen, es handelt sich nicht um ein Problem mit den Zeilenendezeichen in Ihrer Textdatei, funktionieren die Antworten von William Pursell, Andy Lester oder nullrevolution.

Eine Variation des while read...-Vorschlags:

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

Dies kann direkt von der Shell aus ausgeführt werden (keine Batch-/Skriptdatei erforderlich):

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

13
Nick Petersen

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

sed -e 's/^/prefix/' $file
8
Jack

Eine Perl-Methode wäre:

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

oder

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

In beiden Fällen liest das aus filename und gibt die vorangestellten Zeilen an STDOUT aus.

Wenn Sie ein -i-Flag hinzufügen, ändert Perl die Datei an Ort und Stelle. Sie können auch mehrere Dateinamen angeben, und Perl führt alle auf magische Weise aus.

3
Andy Lester

Anstelle 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 mit dem einfacheren geht es viel besser:

sed -e 's/^/prefix/' $file
3
William Pursell

Sie brauchen nicht sed, sondern verketten die Strings im Echo-Befehl

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

Ihre Schleife durchläuft jedes Word in der Datei:

for line in `cat file`; ...
0
glenn jackman

Verwenden Sie sed. Ändern Sie einfach das Wort prefix.

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

Wenn Sie die Ausgabe in einer anderen Datei speichern möchten

sed -e 's/^/prefix/' file.ext > file_new.ext
0
Ahmad Awais