2012-11-27 6 views
13

Ho il seguente codice bash che scorre un file di testo, linea per linea .. im cercando di anteporre il lavoro 'prefisso' per ogni linea, ma invece sono sempre questo errore:Come posso anteporre una stringa all'inizio di ogni riga di un file?

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

Questa è la bash script ..

#!/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 

Cosa sto facendo di sbagliato qui?

Aggiornamento: L'esecuzione di file head head riporta tutte le linee su una singola riga del terminale, probabilmente correlate?

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

Probabilmente avete fine riga non validi nel file. Forse vuoi 'dos2unix' –

+0

@WilliamPursell ho provato a eseguire dos2unix contro il file ma non ho inserito le nuove linee per me, la soluzione più semplice era copiare il contenuto del file in un nuovo file – bobbyrne01

risposta

28

un comando awk una riga dovrebbe fare il trucco anche:

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

così semplice, lo adoro! Ho appena reindirizzato l'output di questi comandi in un file .. Grazie! – bobbyrne01

3

Invece del ciclo for, è più opportuno utilizzare while read...:

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

ma si sarebbe molto meglio con la più semplice: modo

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

il primo blocco di codice non aggiornava il file con i nuovi prefissi e il secondo blocco ha aggiornato solo la prima riga del file – bobbyrne01

3

A Perl fare sarebbe:

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

o

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

In entrambi i casi, che legge da filename e stampa le linee prefissati a STDOUT.

Se si aggiunge un flag -i, Perl modificherà il file in posizione. Puoi anche specificare più nomi di file e Perl magicamente li farà tutti.

0

non hai bisogno di sed, basta concatenare le stringhe nel comando echo

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

vostri itera su ogni parola nel file:

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

per quanto riguarda y il nostro errore originale:

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

Il problema è con questa riga di codice:

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

$ line in questo contesto è il nome del file che sed è in esecuzione contro. Per correggere il codice si dovrebbe risolvere questa linea in quanto tale: nota

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

(anche che il codice originale non dovrebbe avere la < $file alla fine.)

William Pursell risolve correttamente questo problema in entrambi i suoi suggerimenti.

Tuttavia, credo che tu abbia correttamente identificato che c'è un problema con il tuo file di testo originale. dos2unix non risolverà questo problema, in quanto rimuove solo i ritorni a capo di bacchette di Windows alla fine delle righe. (Tuttavia, se si sta tentando di leggere un file di Linux in Windows, si otterrebbe una linea mammut senza ritorni.)

Partendo dal presupposto che non è un problema con la fine di caratteri riga nel file di testo, William Pursell di , Le risposte di Andy Lester o di nullrevolution funzioneranno.

Una variazione sul while read... suggerimento:

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

Questo potrebbe essere eseguito direttamente dalla shell (senza bisogno di un file batch/script):

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

+1

1) disattivare la divisione del campo in modo da non rimuovere spazi vuoti iniziali e di trascinamento e 2) quotare le variabili per MOLTE ragioni: 'mentre IFS = riga read -r; do echo "kp" "$ line"; fatto

6

L'intera loop può essere sostituito da un singolo comando sed che opera sull'intero file:

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

È anche possibile controllare se la linea è vuota o no? –

+0

Vuoi lasciare vuote le linee vuote? – Jack

+1

È passato tanto tempo ... Sarebbe necessario conoscere entrambe le opzioni –

0

Utilizzare sed. Basta cambiare la parola prefix.

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

Se si desidera salvare l'output in un altro file

sed -e 's/^/prefix/' file.ext > file_new.ext 
Problemi correlati