Jeg har en fil som har et RESOURCE
nøkkelord. Det kan forekomme hvor som helst i filen, som:
[email protected]
Nå vil jeg erstatte [email protected]
med [email protected]
. Jeg må søke etter linjen der jeg finner nøkkelordet RESOURCE
og deretter erstatte ordet etter likhetstegnet. Nøkkelordet RESOURCE
må forbli umodifisert.
Kan noen hjelpe meg med dette?
input:
[email protected]
Utgang:
[email protected]
Svar
grep
er ikke nyttig i dette tilfellet, da det ikke tillater deg å endre innholdet i filen.
I stedet kan man bruke sed
slik:
fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile
Gitt file
som
some data [email protected] [email protected] [email protected] [email protected] more data
dette skaper newfile
som
some data [email protected] [email protected] [email protected] [email protected] more data
sed
uttrykk vil velge linjer som starter med strengen RESOURCE
. For hver slik linje vil den erstatte e-postadressen, hvis den er på linjen. Mønsteret som brukes til erstatningen sørger for at vi samsvarer med =
og at adressen slutter på slutten av linjen.
Kommentarer
Svar
sed
kommandoen er bedre.
sed -i "s/[email protected]/[email protected]/" yourfile
Ovennevnte fungerer i testen min, men hvis du vil teste det selv, kan du prøve denne først:
sed "s/[email protected]/[email protected]/" yourfile
Det vil skrive endringene til standardutdata uten å påvirke filen.
Uansett gir det ønsket endring av:
[email protected]
Hvis verdien av RESOURCE
er forskjellig i filen, og du vil endre den noe annet, så:
grep RESOURCE= yourfile
Det vil returnere linjen der den er og vise verdien.
Du kan deretter bruke
sed "s/[email protected]/[email protected]/" yourfile
For fremtidig referanse er det viktig å gjøre alt dette tydelig i det opprinnelige spørsmålet ditt, slik at du kan få den hjelpen du trenger uten all denne rigamarolen.
Kommentarer
- Jeg vil ikke kode [email protected], det skal være noe som [email protected]. Jeg vil erstatte det med noe annet som [email protected]. det skal vær dynamisk
- Jeg forstår ikke ' hva du mener. I spørsmålet ditt viser det at du vil at utdataene skal være
[email protected]
som begge svarene oppnår. Hva mener du med: " Jeg vil ikke kode [email protected] "? og " det skal være dynamisk "? - @ Lakshminarayana Hvis du vil at det faktisk skal gjøre endringene i bruk deretter
sed i
som jeg ga i min første kommando. Test det først medsed
i seg selv i den andre kommandoen for å sikre at den ' gjør det du vil, og bruk derettersed -i
i min første kommando når du ' er sikker på at den fungerer. - jeg mener jeg ikke vil hard kode dem. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' fil. Jeg vil sende det som parametere både input og output.og jeg vil også søke etter den linjen der jeg har RESOURCE og må erstatte den
- @ Lakshminarayana Bruk deretter Kusalananda ' s svar og send e-postadressene til en variabel eller
grep RESOURCE= file
, få e-postadressen som vises, og bruk derettersed -i
og erstatt[email protected]
og[email protected]
med det som er der og hva du vil at det skal være.
Svar
Du ser ut til å si at du vil erstatte strengen som vises etter =
, uansett hva det er – for eksempel , i eksempeldataene vil du erstatte [email protected]
. Men du sier at uansett streng etter =
, vil du erstatte den med [email protected]
– tilsynelatende vil du det hardkodede.
Det er noen varianter på hvordan du gjør dette. Det enkleste er
sed "s/RESOURCE=.*/[email protected]/"
som (som alle kommandoene nedenfor) bruker det faktum at .*
betyr «match uansett er det». Hvis du ikke vil skrive RESOURCE=
to ganger, kan du forkorte ovennevnte til
sed "s/\(RESOURCE=\).*/\[email protected]/"
der \(
… \)
markerer en del av søkestrengen som en gruppe (du kan ha opptil ni grupper) og \1
betyr erstatt med den første gruppen.
Kommandoene ovenfor vil finne og erstatte RESOURCE=
uansett hvor det vises på linjen. Så for eksempel vil inngangen
# 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]
bli endret til
# 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]
Hvis du vil bare matche når RESOURCE=
vises i begynnelsen av en linje, bruk ^
:
sed "s/^RESOURCE=.*/[email protected]/"
eller
sed "s/^\(RESOURCE=\).*/\[email protected]/"
Hvis du bare vil erstatte ressursverdien, og ikke hele resten av linjen – f.eks.
[email protected] [email protected]
til
[email protected] [email protected]
som også kan gjøres. Rediger spørsmålet ditt for å si nøyaktig hva du vil, med fullstendige, klare forklaringer og eksempler.
OK, velg en av de ovennevnte s
kommandoer. Nå, hvis du vil redigere filen på plass (som du har angitt), gjør du
sed -i { s command } { yourfile }
Hvis du vil produsere en ny fil, gjør du
sed { s command } { oldfile } > { newfile }
Ikke skriv {
og }
; de er der bare for avgrensning.
sed -i
hvis du tror det ' gjør det rette, og ikke ' omdirigerer til en ny fil. Jeg ' m unngår vanligvis å brukesed -i
da det ' ikke er bærbart, og siden hvis du skriver o, det kan ødelegge de opprinnelige dataene dine.