Jag har en fil som har ett RESOURCE nyckelord. Det kan förekomma var som helst i filen, som:

[email protected] 

Nu vill jag ersätta [email protected] med [email protected]. Jag måste söka efter raden där jag kan hitta sökordet RESOURCE och sedan ersätta ordet efter likhetstecknet. Nyckelordet RESOURCE måste vara oförändrat.

Kan någon snälla hjälpa mig med detta?

input:

[email protected] 

Utgång:

[email protected] 

Svar

grep är inte användbart i det här fallet eftersom det inte tillåter dig att ändra innehållet i filen.

Istället kan man använda sed så här:

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 

detta skapar newfile som

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

sed uttryck markerar rader som börjar med strängen RESOURCE. För varje sådan rad ersätter den e-postadressen om den finns på raden. Mönstret som används för att ersätta ser till att vi matchar = och att adressen slutar i slutet av raden.

Kommentarer

  • Jag vill inte koda [email protected], det borde vara något som nasir37 @ yahoo .com. jag vill ersätta med alla andra som [email protected]. det ska vara dynamiskt – Lakshminarayana just nu redigera
  • @Lakshminarayana Se uppdaterat svar.
  • Jag vill inte skriv det i en ny fil igen .. eftersom filen också består av andra data. Det som nedan.
  • @Lakshminarayana Kör sedan med sed -i om du tror det ' gör det rätta och omdirigerar ' till en ny fil. Jag ' m undviker i allmänhet att använda sed -i eftersom det ' inte är bärbart och eftersom om du gör en typ o, det kan förstöra dina ursprungliga data.
  • Jag förstår det. hur kan jag söka efter raden som har RESOURCE-ord. Jag måste söka i en fil som har andra data och måste ersätta den. Dessutom måste jag skicka filnamnet som en parameter

Svar

sed -kommandot är bättre.

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

Ovanstående fungerar i mitt test men om du vill testa det själv kan du testa det här först:

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

Som skriver ändringarna till standardutdata utan att det påverkar filen.

Hur som helst, det ger önskad ändring av:

[email protected] 

Om värdet för RESOURCE är annorlunda i filen och du vill ändra det något annat:

grep RESOURCE= yourfile 

Det returnerar raden där den är och visar värdet.

Du kan sedan använda

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

För framtida referens är det viktigt att göra allt detta tydligt i din ursprungliga fråga så att du kan få den hjälp du behöver utan allt detta rigamarole.

Kommentarer

  • Jag vill inte hårdkoda [email protected], det borde vara något som [email protected]. Jag vill ersätta det med något annat som [email protected]. det borde var dynamisk
  • Jag förstår inte ' vad du menar. I din fråga visar det att du vill att utdata ska vara [email protected] vilket båda svaren uppnår. Vad menar du med: " Jag vill inte koda [email protected] "? och " ska det vara dynamiskt "?
  • @Lakshminarayana Om du vill att det faktiskt ska göra ändringarna i använd sedan sed i som jag gav i mitt första kommando. Testa det först med sed i sig själv i mitt andra kommando för att se till att det ' gör vad du vill och använd sedan sed -i i mitt första kommando när du ' är säker på att det fungerar.
  • Jag menar att jag inte vill ha hård kod dem. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' din fil. Jag vill skicka det som parametrar både input och output.och jag vill också söka efter den raden där jag har RESOURCE och måste byta ut den
  • @ Lakshminarayana Använd antingen Kusalananda ' s svar och skicka e-postadresserna till en variabel eller grep RESOURCE= file, få den e-postadress som visas och använd sedan sed -i och ersätt [email protected] och [email protected] med vad som helst där och vad du vill att det ska vara.

Svar

Du verkar säga att du vill ersätta strängen som visas efter =, oavsett vad det är till exempel , i exempeldata vill du ersätta [email protected]. Men du säger att oavsett vad strängen efter = är, vill du ersätta den med [email protected] – tydligen vill du det är hårdkodat.

Det finns några varianter av hur man gör detta. Det enklaste är

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

vilket (som alla kommandon nedan) använder det faktum att .* betyder ”matcha vad som helst finns det”. Om du inte vill skriva RESOURCE= två gånger kan du förkorta ovanstående till

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

där \(\) markerar en del av söksträngen som en grupp (du kan ha upp till nio grupper) och \1 betyder ersätt med den första gruppen.

Kommandona ovan hittar och ersätter RESOURCE= varhelst det visas på raden. Så, till exempel, skulle ingången

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

ändras till

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

Om du vill bara matcha när RESOURCE= visas i början av en rad, använd ^ :

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

eller

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

Om du bara vill ersätta resursvärdet och inte hela resten av raden – t.ex.

[email protected] [email protected] 

till

[email protected] [email protected] 

som också kan göras. Redigera din fråga för att säga exakt vad du vill ha, med fullständiga, tydliga förklaringar och exempel.


OK, välj en av ovanstående s kommandon. Om du nu vill redigera din fil (som du har angett) gör du

sed -i { s command } { yourfile }

Om du vill skapa en ny fil, gör

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

Skriv inte faktiskt { och } ; de finns där bara för avgränsning.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *