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
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 medsed
i sig selv i min anden kommando for at sikre, at det ' gør hvad du vil, og brug dereftersed -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 dereftersed -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.
sed -i
hvis du tror det ' gør det rigtige, og don ' t omdirigerer til en ny fil. Jeg ' m undgår generelt at brugesed -i
da det ' ikke er bærbart, og da hvis du laver en typ o, det kan ødelægge dine originale data.