sed con espressione multipla per argomentazioni sul posto


24

Sto cercando di sostituire più parole nel file utilizzando sed -i #expression1 #expression2

file

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Uscita (desiderata)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Try-out

Posso ottenere il seguente output usando sed -iper 2 volte.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Posso avere un modo possibile di renderlo come un singolo comando sul posto come

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Quando ho provato sopra il codice ci vuole s/item/stuff/gun file e provo a lavorarci su ..


Se i tuoi file sono simili all'esempio sopra (cioè seguono lo stesso modello) puoi farlo con una sola sostituzione:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Risposte:


26

A seconda della versione del sedtuo sistema potresti essere in grado di farlo

sed -i 's/Some/any/; s/item/stuff/' file

Non è necessario il gdopo l'ultima barra nel scomando qui, poiché stai effettuando solo una sostituzione per riga.

In alternativa:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

L' -iopzione dice seddi modificare i file sul posto; se ci sono caratteri immediatamente dopo l' -ipoi sedfa un backup del file originale e utilizza quei personaggi come l'estensione del file di backup. Per esempio,

sed -i.bak 's/Some/any/; s/item/stuff/' file

o

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

verrà modificato file, salvando l'originale in file.bak.

Ovviamente, su un sistema Unix (o Unix-like) normalmente usiamo '~' anziché '.bak', quindi

sed -i~ 's/Some/any/;s/item/stuff/' file

2
Nota che stai descrivendo la variante GNU. La variante BSD (come in FreeBSD o OS / X) richiede un argomento per -i. Così sed -i '' 's/a/b/;s/c/d/' fileo sed -i .back 's/a/b/;s/c/d/'o sed -i.back 's/a/b/;s/c/d/'lì. Altre sedimplementazioni generalmente non supportano -i.
Stéphane Chazelas,

Grazie @ StéphaneChazelas per averlo chiarito. E suppongo che avrei dovuto essere più esplicito nel dire che in GNU sed non può esserci uno spazio tra -il'estensione e l'estensione.
PM 2Ring

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresults sed: -e expression #1, char 141: unterminated s '
command`

@alhelal Siamo spiacenti, i commenti non sono il posto giusto per porre domande. Ma comunque, il tuo ultimo scomando manca del suo finale /.
PM 2Ring

@ PM2Ring come non ho notato che ho indovinato che è correlata la tua soluzione. Comunque grazie.
alhelal,

10

È possibile concatenare espressioni sed insieme a ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

Espressione multipla usando più -eopzioni:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

oppure puoi usarne solo uno:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Dovresti dare un'estensione per il file di backup, poiché quando una certa implementazione di sed, come OSX sed non funziona con un'estensione vuota (devi usare sed -i ''per sovrascrivere i file originali).


1

Puoi usare Vim in modalità Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % seleziona tutte le righe

  2. s sostituire

  3. x salva e chiudi

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.