Lägga till ny rad med sed

För att lägga till en ny rad efter, eller före, en annan speciell rad fungerar sed; ett program för textredigering. Problemet med sed i mac är att den arbetar efter Posix-regler och inte alltid uppför sig som sed i Linux. Fungerar koden i Linux är det alltså inte säkert att den fungerar i Mac OS X. Så här ser kommandot ut i alla fall. Jag förklarar efteråt.

# sed '/matchandetext/a\

nytextradenefter'$'\n' filnamn

Själva programmet heter sed. Sen skriver man in apostrof-tecknet och därefter framåttecknet som markerar början på den stränd som sed ska leta efter; alltså matchandetext i det här fallet. Sen kommer nästa framåtstreck som talar om att nu är det slut på textsträngen som ska matcha. Sen kommer nästa del som består av ett a\ och som betyder append (eller lägg till efter). I och med att vi har tryckt enter efter denna rad kommer vi till en ny rad där sed väntar på fler uppgifter. 

Där kommer textsträngen som ska läggas in under raden som har den matchande strängen. Problemet här var att textsträngen nytextradenefter hamnade på samma rad som matchandetext. Jag ska visa med ett exempel hur en tänkt textfil kan ha sett ut.

textfil som behöver redigeras

matchandetextnytextradenefter

Men det var inte så här det var tänkt. Textsnutten skulle hamna på raden nedanför. Det är därför \n är insatt på slutet, vilket betyder ny rad. Tyvärr fungerar det bara i Linux. Efter en del letande på nätet hittade jag svaret. Man behövde lägga till ett dollartecken omslutet av apostroftecken i slutet av den nya textraden, men före den avslutande apostrofen. Den första och sista apostrofen visar vilken textmassa sed ska arbeta med. Och allra sist ska vi ange vilken fil sed ska ändra i. I det här fallet är det filnamn. En sak till: ändringarna visas bara på bildskärmen. Och det är för att man ska kunna prova utan att förändra filen. För att sed ska ändra i textfilen lägger man till växeln -i. Men det gör man ju inte förrän man ser att allt är till belåtenhet.

Men tänk att textfilen ser ut så här i stället.

                    textfil som behöver redigeras

                    matchandetext

                    mera text på denna rad som är nr 3

Med ovanstående exempel blir det problem när vi ska lägga in en rad efter matchandetext och få tabbar där.

                    textfil som behöver redigeras

                    matchandetext

nytextradenefter

                    mera text på denna rad som är nr 3

Den nya raden blir vänsterställd. Hur bära sig åt för att få till tabbar? Till slut fick jag göra en workaround. Jag fick ersätta texten "matchandetext". Det gick i det här fallet eftersom jag inte behövde den raden med text som ersattes, men någon lösning på Macen på hur man skulle få till tabbarna och ny rad samtidigt hittade jag inte.

sed 's/matchandetext/&\'$'\n\t\tnytextradenefter/' filnamn

I GNU:s sed är det enklare.  Så här ser det ut:

sed '/matchandetext/a\\t\tnytextradenefter' filnamn

Lite kom-ihåg

$ betyder slutet av en rad

^ betyder i början av en rad

& gör att sed kan köras på en rad i Mac OS X. Men ampersand kan också användas på den högra sidan och matchar då det som hittats på den vänstra sidan.