Jeg har en fil, der har et RESOURCE nøgleord. Det kan forekomme hvor som helst i filen, som:

[email protected] 

Nu vil jeg erstatte [email protected] med [email protected]. Jeg er nødt til at søge efter linjen, hvor jeg kan finde nøgleordet RESOURCE og derefter erstatte ordet efter lighedstegnet. Nøgleordet RESOURCE skal forblive uændret.

Kan nogen hjælpe mig med dette?

input:

[email protected] 

Output:

[email protected] 

Svar

grep er ikke nyttigt i dette tilfælde, da det ikke tillader dig at ændre indholdet af filen.

I stedet kan man bruge sed sådan:

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

Givet file som

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

dette skaber newfile som

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

sed udtryk vælger linjer, der starter med strengen RESOURCE. For hver sådan linje erstatter den e-mail-adressen, hvis den findes på linjen. Mønsteret, der bruges til udskiftningen, sørger for at vi matcher = og at adressen slutter i slutningen af linjen.

Kommentarer

  • Jeg ønsker ikke at kode [email protected] hårdt, det skal være noget som nasir37 @ yahoo .com. jeg vil erstatte med andre som [email protected]. det skal være dynamisk – Lakshminarayana lige nu rediger
  • @Lakshminarayana Se opdateret svar.
  • Jeg vil ikke skriv det i en ny fil igen .. fordi filen også består af andre data. Det som nedenfor.
  • @ Lakshminarayana Kør derefter med sed -i hvis du tror det ' gør det rigtige, og don ' t omdirigerer til en ny fil. Jeg ' m undgår generelt at bruge sed -i da det ' ikke er bærbart, og da hvis du laver en typ o, det kan ødelægge dine originale data.
  • Jeg forstår det. hvordan kan jeg søge efter den linje, der har RESOURCE-ordet. Jeg er nødt til at søge i en fil, der har andre data, og skal erstatte den. Desuden er jeg nødt til at videregive filnavnet som en parameter

Svar

sed kommandoen er bedre.

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

Ovenstående fungerer i min test, men hvis du vil teste det selv, kan du prøve denne først:

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

Det vil skrive ændringerne til standardoutput uden at påvirke filen.

Uanset hvad, det giver den ønskede ændring af:

[email protected] 

Hvis værdien af RESOURCE er forskellig i filen, og du vil ændre det noget andet, så:

grep RESOURCE= yourfile 

Det returnerer linjen, hvor den er, og viser værdien.

Du kan derefter bruge

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

Til fremtidig reference er det vigtigt at gøre alt dette klart i dit originale spørgsmål, så du kan få den hjælp, du har brug for uden al denne rigamarole.

Kommentarer

  • Jeg vil ikke hårdt kode [email protected], det skal være noget som [email protected]. Jeg vil erstatte det med noget andet som [email protected]. det skal vær dynamisk
  • Jeg forstår ikke ' hvad du mener. I dit spørgsmål viser det, at du ønsker, at output skal være [email protected], som begge svarene opnår. Hvad mener du med: " Jeg ønsker ikke at kode [email protected] "? og " det skal være dynamisk "?
  • @Lakshminarayana Hvis du vil have det til at foretage ændringerne i brug derefter sed i som jeg gav i min første kommando. Test det først med sed i sig selv i min anden kommando for at sikre, at det ' gør hvad du vil, og brug derefter sed -i i min første kommando, når du ' er sikker på, at det fungerer.
  • Jeg mener, jeg vil ikke hård kode dem. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' din fil. Jeg vil sende det som parametre både input og output.og også vil jeg søge efter den linje, hvor jeg har RESSOURCE og er nødt til at erstatte den
  • @ Lakshminarayana Brug derefter enten Kusalananda ' s svar og send e-mail-adresserne til en variabel eller grep RESOURCE= file, hent den e-mail-adresse, der vises, og brug derefter sed -i og erstat [email protected] og [email protected] med hvad der er der, og hvad du vil have det.

Svar

Du ser ud til at sige, at du vil erstatte den streng, der vises efter =, uanset hvad det er for eksempel , i eksempeldataene vil du erstatte [email protected]. Men du siger det, uanset hvad strengen efter = er, vil du erstatte den med [email protected] – tilsyneladende vil du der er hårdkodet.

Der er et par variationer om, hvordan man gør dette. Den enkleste er

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

som (som alle nedenstående kommandoer) bruger det faktum, at .* betyder “match uanset er der”. Hvis du ikke vil skrive RESOURCE= to gange, kan du forkorte ovenstående til

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

hvor \(\) markerer en del af søgestrengen som en gruppe (du kan have op til ni grupper) og \1 betyder erstat med den første gruppe.

Ovenstående kommandoer finder og erstatter RESOURCE= hvor som helst det vises på linjen. Så for eksempel ville input

# 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] 

blive ændret 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 kun matche, når RESOURCE= vises i begyndelsen af en linje, brug ^ :

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

eller

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

Hvis du kun vil erstatte ressourceværdien og ikke hele resten af linjen – f.eks.

[email protected] [email protected] 

til

[email protected] [email protected] 

der også kan gøres. Rediger dit spørgsmål for at sige nøjagtigt, hvad du vil, med fulde, klare forklaringer og eksempler.


OK, vælg en af ovenstående s kommandoer. Hvis du nu vil redigere din fil (som du har angivet), skal du gøre

sed -i { s command } { yourfile }

Hvis du vil fremstille en ny fil, skal du gøre

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

Skriv faktisk ikke { og } ; de er der kun for afgrænsning.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *