Aggiunta di testo alla fine di più file, meno una riga (Aggiunta di ritorno 0; alla fine di ogni programma in C)


1

Ho un sacco di programmi C di K&R e, naturalmente, nessuna dichiarazione di ritorno. Mi chiedevo se c'era un modo per cat alla fine di ogni file (tranne una riga prima della fine, quindi EOF - 1) la frase "\ treturn 0;" tra cui la scheda prima di essa e la nuova riga dopo di essa.


Benvenuto in Super User! Ti preghiamo di includere sempre il tuo sistema operativo. Le soluzioni dipendono molto spesso dal sistema operativo in uso. Stai usando Windows, Unix, Linux, BSD, OSX, qualcos'altro? Quale versione?
terdon,

Risposte:


0

Alcune opzioni (tutte inutili e esattamente uguali a for f in *c; do echo -e "\treturn 0;" >> "$f"; done):

  1. Perl

    tmp=$(mktemp)
    for f in *c; do
        perl -lpe 'END{print "\treturn 0;"}' "$f" > $tmp && mv $tmp "$f"
    done
    
  2. awk

    tmp=$(mktemp)
    for f in *.c; do
        awk '1;END{print "\treturn 0;"}' "$f" > $tmp && mv $tmp "$f"
    done
    
  3. Cat il file in un file temporaneo, aggiungere la riga e rinominare il file temporaneo:

    tmp=$(mktemp)
    for f in *.c; do
        cat "$f" > $tmp;
        echo -e "\treturn 0;" >> $tmp
        mv $tmp "$f"
    done
    

Sono sconcertato dal motivo per cui il PO ha accettato questa risposta, dal momento che non è quello che ha chiesto. Tutte e tre le opzioni aggiungono semplicemente l' returnistruzione al file, cosa che potrebbe essere eseguita facilmente echo -e "\treturn 0" >> "$f". Ma la domanda chiede come iniettare la returnfrase prima dell'ultima riga. (Inoltre, hai interrotto il punto e virgola.) PS Complimenti per aver vinto le elezioni.
Scott

@Scott non è più sconcertato di me a dirti la verità. Per quanto riguarda echo >> fileho avuto un serio problema tra la tastiera e il mio cervello lì. Per qualche ragione, che non ricordo più, pensavo che questi approcci facessero qualcosa di diverso. Presumibilmente stavo pensando a qualcosa di simile a quello che fa la tua risposta e poi ho deciso di reinventare la ruota. Non posso fare molto al riguardo, dato che è accettato, ma potresti anche dargli un voto negativo, almeno il tuo sorgerà. PS Grazie :)
terdon,

1

Alcune opzioni:

  1. Unix:

    tmp=$(mktemp)
    for f in *c; do
        head --lines=-1 "$f" > "$tmp"
        echo -e "\treturn 0;" >> "$tmp"
        tail -1 "$f" >> "$tmp"
        mv "$tmp" "$f"
    done
    
  2. awk:

    tmp=$(mktemp)
    for f in *.c; do
        awk 'NR > 1 { print prev_line; }
                    { prev_line = $0; }
                END { print "\treturn 0;"; print; }' "$f" > "$tmp" \
        &&  mv "$tmp" "$f"
    done
    
  3. sed:

    for f in *.c; do
        sed -i '$i\
    \treturn 0;' "$f"
    done
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.