Ho un file che ha una parola chiave RESOURCE. Può trovarsi ovunque nel file, come:

[email protected] 

Ora voglio sostituire [email protected] con [email protected]. Devo cercare la riga in cui posso trovare la parola chiave RESOURCE e quindi sostituire la parola dopo il segno di uguale. La parola chiave RESOURCE deve rimanere invariata.

Qualcuno potrebbe aiutarmi in questo?

input:

[email protected] 

Risultato:

[email protected] 

Risposta

grep non è utile in questo caso poiché non ti consente di modificare il contenuto del file.

Invece, si può usare sed in questo modo:

fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile 

Dato file come

some data [email protected] [email protected] [email protected] [email protected] more data 

questo crea newfile come

some data [email protected] [email protected] [email protected] [email protected] more data 

Il Lespressione sed selezionerà le righe che iniziano con la stringa RESOURCE. Per ciascuna di queste righe, sostituirà lindirizzo email, se presente sulla riga. Il modello utilizzato per la sostituzione fa in modo che corrispondiamo a = e che lindirizzo termini alla fine della riga.

Commenti

  • Non voglio codificare [email protected], dovrebbe essere qualcosa come nasir37 @ yahoo .com. Voglio sostituire con qualsiasi altro come [email protected]. Dovrebbe essere dinamico – Lakshminarayana ora modifica
  • @Lakshminarayana Vedi risposta aggiornata.
  • Non voglio scrivilo di nuovo in un nuovo file .. perché il file è composto anche da altri dati. È come di seguito.
  • @Lakshminarayana Quindi esegui con sed -i se pensi ' sta facendo la cosa corretta e non ' reindirizza a un nuovo file. ' in genere evito di utilizzare sed -i poiché ' non è portatile e poiché se fai un typ o, potrebbe distruggere i tuoi dati originali.
  • Lo capisco. come posso cercare la riga che sta avendo parola RISORSA. Devo cercarlo in un file che contiene altri dati e devo sostituirlo. Inoltre devo passare il nome del file come parametro

Risposta

Il sed il comando è migliore.

sed -i "s/[email protected]/[email protected]/" yourfile 

Quanto sopra funziona nel mio test, ma se vuoi provarlo tu stesso, puoi provare prima questo:

sed "s/[email protected]/[email protected]/" yourfile 

Questo scriverà le modifiche allo standard output senza influire sul file.

In ogni caso, fornisce la modifica desiderata di:

[email protected] 

Se il valore di RESOURCE è diverso nel file e desideri modificarlo in modo diverso, allora:

grep RESOURCE= yourfile 

Questo restituirà la riga dove si trova e mostrerà il valore.

Puoi quindi utilizzare

sed "s/[email protected]/[email protected]/" yourfile 

Per riferimento futuro, è importante chiarire tutto questo nella tua domanda originale in modo da poter ottenere laiuto di cui hai bisogno senza tutta questa tiritera.

Commenti

  • Non voglio codificare in modo rigido [email protected], dovrebbe essere qualcosa come [email protected]. Voglio sostituirlo con qualsiasi altro come [email protected]. dovrebbe sii dinamico
  • Non ' non capisco cosa intendi. Nella tua domanda, mostra che vuoi che loutput sia [email protected] che entrambe le risposte ottengono. Cosa intendi con: " Non voglio codificare [email protected] "? e " dovrebbe essere dinamico "?
  • @Lakshminarayana Se desideri che effettui le modifiche al file quindi usa sed i come ho dato nel mio primo comando. Provalo prima con sed da solo nel mio secondo comando per assicurarti che ' stia facendo quello che vuoi e poi usa sed -i nel mio primo comando una volta che ' sei sicuro che funzioni.
  • Voglio dire che non voglio hard code loro. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' tuofile. voglio passarlo come parametri sia di input che di output.e voglio anche cercare quella riga in cui ho RESOURCE e devo sostituirla
  • @Lakshminarayana Quindi usa la risposta di Kusalananda ' e passa gli indirizzi email a una variabile o grep RESOURCE= file, ottieni lindirizzo email visualizzato, quindi utilizza sed -i e sostituisci [email protected] e [email protected] con qualunque cosa ci sia e qualunque cosa tu voglia che sia.

Rispondi

Sembra che tu stia dicendo che desideri sostituire la stringa che appare dopo =, qualunque cosa sia ad esempio , nei dati di esempio, vuoi sostituire [email protected]. Ma stai dicendo che, qualunque sia la stringa dopo =, vuoi sostituirla con [email protected], apparentemente vuoi che è hardcoded.

Ci sono alcune variazioni su come farlo. Il più semplice è

sed "s/RESOURCE=.*/[email protected]/" 

che (come tutti i comandi seguenti) utilizza il fatto che .* significa “corrisponde a qualsiasi è lì”. Se non desideri digitare RESOURCE= due volte, puoi abbreviare quanto sopra in

sed "s/\(RESOURCE=\).*/\[email protected]/" 

dove \(\) contrassegna una parte della stringa di ricerca come gruppo (puoi avere fino a nove gruppi) e \1 significa sostituire con il primo gruppo.

I comandi precedenti troveranno e sostituiranno RESOURCE= ovunque appaia sulla riga. Quindi, ad esempio, linput

# Lakshminarayana wants to change all occurrences of "RESOURCE=". [email protected] [email protected] [email protected] FOX RESOURCE=The quick brown fox # Comment: Originally line 2 said [email protected] 

verrebbe modificato in

# Lakshminarayana wants to change all occurrences of "[email protected] [email protected] [email protected] [email protected] FOX [email protected] # Comment: Originally line 2 said [email protected] 

Se vuoi trovare una corrispondenza solo quando RESOURCE= viene visualizzato allinizio di una riga, utilizza ^ :

sed "s/^RESOURCE=.*/[email protected]/" 

o

sed "s/^\(RESOURCE=\).*/\[email protected]/" 

Se desideri sostituire solo il valore della risorsa e non lintero resto della riga, ad esempio

[email protected] [email protected] 

in

[email protected] [email protected] 

anche questo può essere fatto. Modifica la tua domanda per dire esattamente ciò che desideri, con spiegazioni complete e chiare ed esempi.


OK, scegli uno dei s . Ora, se vuoi modificare il tuo file in posizione (come hai indicato), fai

sed -i { s command } { yourfile }

Se vuoi produrre un nuovo file, fai

sed { s command } { oldfile } > { newfile }

Non digitare effettivamente { e } ; esistono solo per demarcazione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *