Come modificare a livello di codice un file usando solo il terminale?


13

Vorrei scrivere uno script di shell in base al quale potrei leggere il file dal comando e modificarlo senza intervento manuale (basato sulla ricerca di un testo e sulla sua sostituzione con un altro).

Non ho bisogno di usare nessun editor di testo per questo .... semplicemente la ricerca di testo (come usare grep) e poi sostituirlo con qualche altro testo e salvare le modifiche ....

Risposte:


10

È qui che sedentra in gioco. Un sedcomando ha questo formato:

[pattern1][,pattern2][!] command [args]

Usa regex quindi può / sarà un po 'difficile. Alcuni esempi di base presi dal secondo link qui sotto:

# sostituisci (trova e sostituisci) "pippo" con "barra" su ogni riga
sed 's / foo / bar /' # sostituisce solo la 1a istanza di una riga
sed 's / foo / bar / 4' # sostituisce solo la quarta istanza di una riga
sed 's / foo / bar / g' # sostituisce TUTTE le istanze in una riga
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # sostituisce il penultimo caso
sed 's / \ (. * \) foo / \ 1bar /' # sostituisce solo l'ultimo caso

# sostituisce "foo" con "bar" SOLO per le righe che contengono "baz"
sed '/ baz / s / foo / bar / g'

# sostituisce "foo" con "bar" TRANNE le righe che contengono "baz"
sed '/ baz /! s / foo / bar / g'

# cambia "scarlatto" o "rubino" o "puce" in "rosso"
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # most seds
Solo gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU

Alcuni riferimenti


7

Risposta molto tardi. Tuttavia, questo potrebbe aiutare gli altri con un problema / domanda simile.

Consiglierei di creare e applicare una patch. Un bell'esempio può essere trovato qui .

Ad esempio, supponendo che un file new.txt contenga modifiche che si desidera applicare a old.txt. È possibile eseguire i comandi su un terminale o creando ed eseguendo un patch_file.sh.

Riga di comando: apri un terminale e copia ed esegui le righe seguenti (cambia i nomi dei file come necessario):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Script: utilizzando un approccio file .sh. In un terminale (tastiera: ctrl + alt + t: gedit patch_file.sh

Copia e incolla i comandi che verrebbero inviati sul terminale, nel file .sh e sotto l'intestazione come mostrato di seguito (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Rendi eseguibile lo script (terminale):

chmod +x patch_file.sh

Esegui lo script (terminale):

./patch_file.sh # may require sudo access depending on the directory affected

La patch +1 è sempre la strada diritta per modifiche medio-pesanti o complesse. Non so perché alcuni provino a fare qualsiasi cosa usando gli strumenti regex.
user.dz

+1 molto meglio dell'ingegnerizzazione inversa di una regex che sembra applicare la modifica desiderata sul file testato con ... ma quando applicata ad altre istanze di quel file a volte ha altri effetti.
bigjosh

Ha senso una patch se voglio sostituire tutte le istanze di stringhe di testo specifiche, ovvero sostituire tutto "" con "_", tutto "meno" con "-" e tutto "gb | <string_of_numbers> | ARO:" con " ARO: "? Grazie.
Josh

1

Se vuoi modificare un file, usa un editor di file, ci sono editor di file basati su comandi che possono essere usati da script, come ex o ed .


1

Stai cercando sed o awk. Trovo sed per essere più semplice e awk per essere più potente.

Ecco un esempio da un'altra domanda .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Questo significa:

  • cerca nel file /usr/share/applications/defaults.list
  • Trova / grep gedit.desktop
  • Sostituirlo con yournew.desktop
  • Applica le modifiche in atto -i

0

A seconda di ciò che è necessario modificare, se si ha familiarità con viallora edpotrebbe essere utile.

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.