Come modificare più file di testo con un singolo comando?


18

Voglio rimuovere la prima riga di più file di testo e sostituirla con un'altra riga. C'è un modo per farlo usando il terminale?

So usare vim, c'è un modo per automatizzarlo con esso? Voglio evitare di farlo manualmente (come nel modificare ogni file singolarmente).

Se possibile, vorrei evitare di installare nuove librerie (specialmente per qualcosa di simile che considero molto semplice, ma potrei sbagliarmi).

Grazie in anticipo!

Risposte:


21

Puoi usare sed:

sed -i.bak '1s/^.*$/new line/' *.txt

Questo sostituirà la prima riga di tutti i .txtfile nella directory corrente con il testo new line, modificandolo per soddisfare le tue necessità.

Inoltre, verrà eseguito il backup dei file originali con .bakestensione, se non si desidera utilizzare solo:

sed -i '1s/^.*$/new line/' *.txt

Grazie! sedè in realtà quello che stavo cercando!
TomTsagk,

@TomTsagk Sono contento di poterti aiutare :)
heemayl

11

Bene, usando vimse stesso:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

Cosa fa questo:

  • setline (n, text)bene, è una funzione che imposta la linea nsu text.
  • call è necessario per chiamare le funzioni.
  • bufdo viene utilizzato per ripetere un comando tra i buffer (senza intervallo, agisce su tutti i buffer).
  • wqsalva ed esce dal buffer. Dobbiamo farlo prima di passare al buffer successivo, quindi questo comando è incatenato al callcomando usando |.
  • -c cmdeseguito cmdè un comando in modalità comando dopo aver caricato il primo buffer.
  • Nes attiva non compatibile, silenzioso, ex-mode, che è meglio per l'elaborazione non interattiva.

Benefici:

  • Il setlinecontenuto del testo può essere qualsiasi cosa - un &in un sedtesto sostitutivo può avere effetti indesiderati.

sedsembra molto più facile da usare, ma è davvero fantastico che vimpossa fare lo stesso! Grazie mille per la tua risposta!
TomTsagk

@TomTsagk, volevo solo illustrare come potresti agire su più file ( bufdo). Considera di avere i file già aperti e ... E di mostrare un'alternativa a 1s/foo/bar/.
muru,

Awesoming !!! <3_ <3
Campa

3

Alcune altre opzioni:

  • awk(necessita di una versione relativamente nuova di GNU awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / shell

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Shell / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

Questo script farà come richiesto, posizionando i file modificati in una nuova directory senza modificare effettivamente gli originali.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

Stavo rispondendo lentamente (ho testato il mio codice) ... e mi piace molto di più la soluzione di heemayl!
Charles Boling,

0

utilizzando gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Esempio

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit: lo uso per la ricerca e sostituzione di massa. È potente con la possibilità di utilizzare RegEx - Regular Expressions. È possibile operare su file all'interno di una directory, specificare estensioni di file, ad esempio ".html" e così via. Inoltre, puoi visualizzare le impostazioni internazionali della modifica del candidato nel contesto, in una GUI. jEdit è fantastico.

jEdit è disponibile tramite il centro software di Ubuntu.


0

I comandi tail e cat lo farebbero facilmente:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Avvolgi quelli in un ciclo adatto e forse usa un file temporaneo corretto e giusto invece di un nome di file temporaneo codificato. Credo che bash e altre shell abbiano una sintassi per la creazione di file temporanei.

L'opzione -n ​​di tail ha due interpretazioni a seconda che l'argomento abbia un segno più. Se ha un segno più, significa che mostra la coda del file a partire dal numero di riga indicato. Altrimenti il ​​numero è il numero di righe, inclusa l'ultima riga, che la coda dovrebbe produrre.

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.