Ik heb een bestand met een RESOURCE sleutelwoord. Het kan overal in het bestand voorkomen, zoals:

[email protected] 

Nu wil ik [email protected] vervangen door [email protected]. Ik moet naar de regel zoeken waar ik het RESOURCE trefwoord kan vinden en dan het woord na het gelijkteken vervangen. Het RESOURCE sleutelwoord moet ongewijzigd blijven.

Kan iemand mij hierbij helpen?

input:

[email protected] 

Uitvoer:

[email protected] 

Antwoord

grep is in dit geval niet nuttig omdat het u niet toestaat de inhoud van het bestand te wijzigen.

In plaats daarvan kan men sed zoals:

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

Gegeven file als

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

dit creëert newfile als

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

De sed expressie selecteert regels die beginnen met de tekenreeks RESOURCE. Voor elke regel vervangt het het e-mailadres, als het op de regel staat. Het patroon dat voor de vervanging wordt gebruikt, zorgt ervoor dat we overeenkomen met de = en dat het adres eindigt aan het einde van de regel.

Reacties

  • Ik wil de [email protected] niet hard coderen, het zou iets moeten zijn als nasir37 @ yahoo .com. ik wil het vervangen door een ander zoals [email protected]. het moet dynamisch zijn – Lakshminarayana zojuist bewerkt
  • @Lakshminarayana Zie bijgewerkt antwoord.
  • Ik wil niet schrijf het opnieuw in een nieuw bestand .. omdat het bestand ook uit andere gegevens bestaat. Zoals hieronder.
  • @Lakshminarayana Voer vervolgens uit met sed -i als je denkt het ' doet het juiste, en stuur ' niet door naar een nieuw bestand. Ik ' m over het algemeen het gebruik van sed -i vermijden omdat het ' niet-draagbaar is en aangezien als je een typ o, het kan uw originele gegevens vernietigen.
  • Ik begrijp dat. hoe kan ik zoeken naar de regel die het woord RESOURCE heeft. Ik moet het zoeken in een bestand dat andere gegevens bevat en het moet vervangen. Bovendien moet ik de bestandsnaam doorgeven als een parameter

Answer

De sed commando is beter.

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

Het bovenstaande werkt in mijn test, maar als je het zelf wilt testen, kun je dit eerst proberen:

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

Dat zal de wijzigingen naar de standaarduitvoer schrijven zonder het bestand te beïnvloeden.

Hoe dan ook, het geeft de gewenste wijziging van:

[email protected] 

Als de waarde van RESOURCE anders is in het bestand en u het iets anders wilt wijzigen:

grep RESOURCE= yourfile 

Dat zal de regel teruggeven waar het is en de waarde tonen.

Je kunt dan

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

gebruiken

Voor toekomstige referentie is het belangrijk om dit allemaal duidelijk te maken in je oorspronkelijke vraag, zodat je de hulp kunt krijgen die je nodig hebt zonder al deze rompslomp.

Opmerkingen

  • Ik wil de [email protected] niet hard coderen, het zou iets moeten zijn als [email protected]. ik wil het vervangen door andere zoals [email protected]. het zou moeten wees dynamisch
  • Ik ' begrijp niet wat je bedoelt. In uw vraag laat het zien dat u wilt dat de uitvoer [email protected] is, wat met beide antwoorden wordt bereikt. Wat bedoel je met: " Ik wil de [email protected] " niet hard coderen? en " het moet dynamisch zijn "?
  • @Lakshminarayana Als je wilt dat het de wijzigingen daadwerkelijk aanbrengt in de bestand en gebruik dan sed i zoals ik gaf in mijn eerste commando. Test het eerst met de sed op zichzelf in mijn tweede commando om er zeker van te zijn dat het ' doet wat je wilt en gebruik vervolgens de sed -i in mijn eerste commando zodra je ' zeker weet dat het werkt.
  • ik bedoel, ik wil niet hard programmeren hen. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' uw bestand. ik wil het doorgeven als parameters, zowel invoer als uitvoer.en ik wil ook zoeken naar die regel waar ik RESOURCE heb en deze moet vervangen
  • @Lakshminarayana Gebruik dan het antwoord van Kusalananda ' en geef de e-mailadressen door naar een variabele of grep RESOURCE= file, haal het e-mailadres op dat wordt weergegeven en gebruik vervolgens sed -i en vervang [email protected] en [email protected] met wat er ook is en wat je maar wilt.

Antwoord

U lijkt te zeggen dat u de tekenreeks wilt vervangen die verschijnt na de =, wat het ook is bijvoorbeeld , , in de voorbeeldgegevens wilt u . Maar u zegt dat, wat de tekenreeks na de = ook is, u deze wilt vervangen door [email protected] – blijkbaar wilt u dat hard gecodeerd.

Er zijn een paar variaties op hoe dit te doen. De eenvoudigste is

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

die (net als alle onderstaande commandos) het feit gebruikt dat .* betekent “match wat dan ook is er”. Als u RESOURCE= niet twee keer wilt typen, kunt u het bovenstaande inkorten tot

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

waarbij \(\) markeert een deel van de zoekreeks als een groep (u kunt maximaal negen groepen hebben) en \1 betekent vervangen door de eerste groep.

De bovenstaande commandos zullen RESOURCE= zoeken en vervangen waar het ook op de regel verschijnt. De invoer

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

zou bijvoorbeeld worden gewijzigd 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] 

Als je wilt alleen matchen als RESOURCE= aan het begin van een regel verschijnt, gebruik ^ :

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

of

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

Als u alleen de bronwaarde wilt vervangen, en niet de hele rest van de regel, bijv.

[email protected] [email protected] 

naar

[email protected] [email protected] 

dat kan ook. Bewerk uw vraag om precies te zeggen wat u wilt, met volledige, duidelijke uitleg en voorbeelden.


OK, kies een van de bovenstaande s opdrachten. Als u uw bestand nu ter plekke wilt bewerken (zoals u hebt aangegeven), doe dan

sed -i { s command } { yourfile }

Als u een nieuw bestand wilt maken, doet u

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

Typ niet de { en } ; ze zijn er alleen voor afbakening.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *