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
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 medsed
i sig själv i mitt andra kommando för att se till att det ' gör vad du vill och använd sedansed -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 sedansed -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.
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ändased -i
eftersom det ' inte är bärbart och eftersom om du gör en typ o, det kan förstöra dina ursprungliga data.