2013-06-07 12 views
8

Domanda: Ho bisogno di aggiungere alcune parole alla fine di ogni riga di un file di testo. Qualcuno conosce qualche script di shell bash di Linux che può fare questo lavoro? Grazie!script di shell aggiungi suffisso ogni riga

Esempio: aggiungere parola done alla fine di ogni riga:

line1 abcdefg done 
line2 abcdefg done 
line3 abcdeft done 

risposta

22

Uso awk:

awk 'NF{print $0 " done"}' inFile 

O sed con la bandierina in linea:

sed -i.bak '!/[^[:blank:]]/s/$/ done/' inFile 
+0

@ Bing.Physics: Ha fatto questo lavoro per voi? – anubhava

+0

Il problema con le soluzioni che aggiungono una riga aggiuntiva con 'done' alla fine del file - questo non è voluto. –

+0

Ok controlla la mia risposta modificata ora. – anubhava

2

Ho letto ?

Contenuto script.vim:

set backup 
g/^/ normal A done 
normal ZZ 

gestire l'IT come:

vim -S script.vim infile 

Sarà modificare il file sul posto la creazione di un backup con ~ suffisso.

1

Se si vuole fare questo in puro bash si potrebbe fare:

#!/bin/bash 

INFILE=$1 
TMPFILE=/tmp/$INFILE.$$ 


while IFS= read -r; do 
    echo "$REPLY done"; 
done <$INFILE >$TMPFILE ; 

mv $TMPFILE $INFILE; 

Il che, se chiamati append.sh può essere definito come tale:

bash append.sh file.txt 

Redatta come per i commenti di 1_CR.

+0

uno avrebbe pensato che l'aggiunta multipla a '$ TMPFILE' all'interno del ciclo potrebbe essere sostituita con un singolo'> $ TMPFILE' alla fine del ciclo – iruvar

+0

@ 1_CR In effetti sarebbe meglio, ho cambiato il codice per riflettere Questo. – imp25

+0

Mentre ci sei, imposta 'IFS' su una stringa nulla e passa' -r' a 'read', qualcosa come' while IFS = read -rx; '.. leggi tutto a riguardo [qui] (http://wiki.bash-hackers.org/commands/builtin/read). +1, BTW – iruvar

0

modo Perl ... uguale a quella del awk uno di linea

ingresso

line1 abcdefg 
line2 abcdefg 
line3 abcdeft 

Codice

perl -lane 'print $F[0]," ",$F[1]," done"' Input 
+0

Meglio '" @F "' (nota le doppie virgolette) che '$ F [0]," ", $ F [1]'.Nel caso in cui la linea sia più lunga (o più corta) di due parole. – Birei

+0

Sì, sono d'accordo .... !! – Debaditya

1

sed e 'sempre utile per questo tipo di attività ,

# cat append.txt 
line1 abcdefg 
line2 abcdefg 
line3 abcdeft 

# sed -i 's/$/done/g' append.txt 

# cat append.txt 
line1 abcdefg done 
line2 abcdefg done 
line3 abcdeft done 

o

è possibile utilizzare il seguente script:

# cat sedcheck.sh 
#!/bin/bash 
if [ $# -eq 0 ] 
    then 
     echo "No input supplied" 
    else 
     sed -i 's/$/ '$1'/g' $2 
fi 


# cat append.txt 
line1 abcdefg donedin 
line2 abcdefg donedin 
line3 abcdeft donedin 

# ./sedcheck.sh testing append.txt 

# cat append.txt 
line1 abcdefg donedin testing 
line2 abcdefg donedin testing 
line3 abcdeft donedin testing