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

  • Jeg vil ikke hardkode [email protected], det skal være noe som nasir37 @ yahoo .com. jeg vil erstatte med andre som [email protected]. det skal være dynamisk – Lakshminarayana akkurat nå rediger
  • @ Lakshminarayana Se oppdatert svar.
  • Jeg vil ikke skriv det i en ny fil igjen .. fordi filen består av andre data også. Det som nedenfor.
  • @Lakshminarayana Kjør så med sed -i hvis du tror det ' gjør det rette, og ikke ' omdirigerer til en ny fil. Jeg ' m unngår vanligvis å bruke sed -i da det ' ikke er bærbart, og siden hvis du skriver o, det kan ødelegge de opprinnelige dataene dine.
  • Jeg forstår det. hvordan kan jeg søke etter linjen som har RESOURCE-ordet. Jeg må søke i en fil som har andre data, og må erstatte den. Videre må jeg sende filnavnet som en parameter

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 med sed i seg selv i den andre kommandoen for å sikre at den ' gjør det du vil, og bruk deretter sed -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 deretter sed -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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *