2013-06-07 20 views
8

Pytanie: Potrzebuję dodać kilka słów na końcu każdego wiersza pliku tekstowego. Czy ktoś zna dowolny skrypt powłoki bash Linuxa, który może wykonać tę pracę? Dzięki!Skrypt powłoki dodaj sufiks każdej linii

Przykład: dodaj słowo done na końcu każdej linii:

line1 abcdefg done 
line2 abcdefg done 
line3 abcdeft done 

Odpowiedz

22

Zastosowanie awk:

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

LUB sed z inline flag

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

@ Bing.Physics: Czy to praca dla Ciebie? – anubhava

+0

Problem z rozwiązaniami, które dodają dodatkową linię z 'done' na końcu pliku - ten nie jest poszukiwany. –

+0

OK sprawdź teraz poprawioną odpowiedź. – anubhava

2

Czy czytam ?

Zawartość script.vim:

set backup 
g/^/ normal A done 
normal ZZ 

Run to lubią:

vim -S script.vim infile 

Będzie zmodyfikować plik w miejscu tworzenia kopii zapasowej z ~ przyrostka.

1

Jeśli chcesz to zrobić w czystej bash można zrobić:

#!/bin/bash 

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


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

mv $TMPFILE $INFILE; 

Które, jeśli nazywa append.sh można nazwać jako takie:

bash append.sh file.txt 

Zmieniano jak za komentarze 1_CR użytkownika.

+0

można by pomyśleć, że wielokrotny dodatek do '$ TMPFILE' w pętli może zostać zastąpiony pojedynczym'> $ TMPFILE' na końcu pętli – iruvar

+0

@ 1_CR Rzeczywiście byłoby lepiej, zmieniłem kod, aby odzwierciedlał to. – imp25

+0

Podczas gdy jesteś w tym miejscu, ustaw 'IFS' na zerowy łańcuch i przekazuj' -r' do 'read', coś jak' while IFS = read -rx; '.. przeczytaj wszystko o tym [tutaj] (http: // /wiki.bash-hackers.org/commands/builtin/read). +1, BTW – iruvar

0

Perl sposób ... taki sam jak w awk jeden liniowej

Wejście

line1 abcdefg 
line2 abcdefg 
line3 abcdeft 

Kod

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

Lepsze '' @F "' (zauważ podwójne cudzysłowy), że '$ F [0]," ", $ F [1]'.Na wypadek, gdyby linia była dłuższa (lub krótsza) niż dwa słowa. – Birei

+0

Zgadzam się ... !! – Debaditya

1

sed jest sprecyzowane pomocne dla tego rodzaju zadań ,

# 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 

lub

można użyć poniższy skrypt:

# 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 
Powiązane problemy