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
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 consed
da solo nel mio secondo comando per assicurarti che ' stia facendo quello che vuoi e poi usased -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 utilizzased -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.
sed -i
se pensi ' sta facendo la cosa corretta e non ' reindirizza a un nuovo file. ' in genere evito di utilizzaresed -i
poiché ' non è portatile e poiché se fai un typ o, potrebbe distruggere i tuoi dati originali.