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
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 desed
op zichzelf in mijn tweede commando om er zeker van te zijn dat het ' doet wat je wilt en gebruik vervolgens desed -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 vervolgenssed -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.
sed -i
als je denkt het ' doet het juiste, en stuur ' niet door naar een nieuw bestand. Ik ' m over het algemeen het gebruik vansed -i
vermijden omdat het ' niet-draagbaar is en aangezien als je een typ o, het kan uw originele gegevens vernietigen.