Hur matchar jag exakt ord och ersätter bara det i fil?

Frågor kring allt som rör systemadministration.
Post Reply
greenlearnerlinux
Posts: 128
Joined: 30 August 2005, 10:44

Hur matchar jag exakt ord och ersätter bara det i fil?

Post by greenlearnerlinux » 25 February 2011, 01:22

Code: Select all

grep height  fil:
        line-height: 16px;
	line-height: 20px;
	line-height: 22px;
	height: 38px;
	height: 39px;
fråga 1:
hur grepar jag enbart height raden utan att line-height påverkas?
fråga 2:
hur grepar jag height raden ändrar alla världen till 40px utan att line-height raderna påverkas?


jag har försökt med olika former av sed och grep.
grep -o grepar ordet korrekt, men skriver jag till ny fil kommer endast ändringen med.
grep -o fil sed s/height//g >nyfil
Pessimisten ser en svårighet i varje möjlighet och optimisten en möjlighet i varje svårighet!

User avatar
Per_
Posts: 212
Joined: 7 March 2003, 23:03
Location: Östersund

Re: Hur matchar jag exakt ord och ersätter bara det i fil?

Post by Per_ » 25 February 2011, 07:07

greenlearnerlinux wrote:

Code: Select all

grep height  fil:
        line-height: 16px;
	line-height: 20px;
	line-height: 22px;
	height: 38px;
	height: 39px;
fråga 1:
hur grepar jag enbart height raden utan att line-height påverkas?
fråga 2:
hur grepar jag height raden ändrar alla världen till 40px utan att line-height raderna påverkas?


jag har försökt med olika former av sed och grep.
grep -o grepar ordet korrekt, men skriver jag till ny fil kommer endast ändringen med.
grep -o fil sed s/height//g >nyfil
Om det alltid är ett mellanslag före height kan du använda sed s/\ height/\ /g
Det finns tre sorters människor:
De som kan räkna och de som inte kan.

greenlearnerlinux
Posts: 128
Joined: 30 August 2005, 10:44

Re: Hur matchar jag exakt ord och ersätter bara det i fil?

Post by greenlearnerlinux » 25 February 2011, 10:34

Tack ,men det fungerade inte. Det är svårare än det först verkar. Jag glömde nämna att matchningen börjar med 2 blanksteg eller tab eller nån form av whitespace.

Code: Select all

sed s/\ height/\ /g fil1 >fil2
cat fil2 |grep height
line-height: 39px;
	height: 196px;
	height: 30px;
	line-height: 30px;
	height: 26px;
	height: 17px;
	height: 20px;
	height: 30px;
	line-height: 30px;
	height: 30px;
	height: 20px;
	height: 52px;
	line-height: 16px;

Code: Select all

önskade output är:


	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
	height: 40px;
Pessimisten ser en svårighet i varje möjlighet och optimisten en möjlighet i varje svårighet!

greenlearnerlinux
Posts: 128
Joined: 30 August 2005, 10:44

Re: Hur matchar jag exakt ord och ersätter bara det i fil?

Post by greenlearnerlinux » 25 February 2011, 11:39

Rättelse!
önskat slutresultat är att hela fil1 kopieras till fil2 och därefter modifieras bara rader som börjar med whitespace följt av height
och övriga data lämnas orörda i fil2.

cat fil2|grep height:
line-height: 39px;
height: 40px;
height: 40px
;
line-height: 40px;
height: 40px;
height: 40px;
height: 40px;
height: 40px;

line-height: 30px;
height: 40px;
height: 40px;
Pessimisten ser en svårighet i varje möjlighet och optimisten en möjlighet i varje svårighet!

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Re: Hur matchar jag exakt ord och ersätter bara det i fil?

Post by kjell-e » 28 February 2011, 20:00

Du behöver sed eller awk eller något liknande.

Om det alltid förekommer minst ett blanktecken före height:, mellanslag eller tab, då behöver du matcha mot dessa rader och bara ersätta dessa med det nya innehållet.

Ett sätt att göra det på är att matcha mot det önskade och bara då utföra substitueringen.

Code: Select all

sed '/matchningsmönster/s/vad som ska ersättas/ersättas med/g' infil > utfil
Om du bara har en förekomst av height per rad kan du t.ex. göra:

Code: Select all

sed '/[ \t]height:/s/:.*/: 40px;/' infil > utfil
Här behålls exakt det/de whitespace som var från början.

Har du flera förekomster per rad av height och det dessutom kan förekomma flera blanktecken mellan height: och siffrorna respektive mellan talet och px; så kan du t.ex. göra så här:

Code: Select all

sed  '/[ \t]height:/s/:[ ]*[0-9]*[ ]*px;/: 40px;/g' infil > utfil
Kan det dessutom förekomma line-height: på samma rad som en height: då behöver din substituering innehålla [ \t]height:

Code: Select all

sed  '/[ \t]height:/s/[ \t]height:[ ]*[0-9]*[ ]*px;/ height: 40px;/g' infil > utfil
Var det så du menade att du ville ha det?

Post Reply