Läsa och skriva enskilda rader i ett dokument? [löst]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
HOLMEN
Fadder
Inlägg: 1724
Blev medlem: 29 mar 2006, 22:39
OS: Ubuntu
Utgåva: Vet inte/ingen utgåva passar
Ort: Göteborg
Kontakt:

Läsa och skriva enskilda rader i ett dokument? [löst]

Inlägg av HOLMEN »

Halloj,

Jag håller på och mekar med att skapa inställningsfiler för ett program jag skriver. Jag skulle då vilja veta hur jag ska kunna läsa en viss fil och sedan leta reda på en enskild rad och sedan kunna ändra bara just den. Men också bara att kunna läsa en rad för att se om en inställning är satt som true eller false, tex.

Måste man ju kunna göra på något vis, men hur?
Senast redigerad av 1 HOLMEN, redigerad totalt 7 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av Konservburk »

Både sed och awk är bra på sånt.
Användarvisningsbild
HOLMEN
Fadder
Inlägg: 1724
Blev medlem: 29 mar 2006, 22:39
OS: Ubuntu
Utgåva: Vet inte/ingen utgåva passar
Ort: Göteborg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av HOLMEN »

Tack, men jag skulle gärna vilja ha lite mer ingående hjälp med dessa. Eller något av dem. Bara ett exempel. Har kollat på awk, men är inte riktigt med i svängarna.
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av David Andersson »

Det finns lite olika skolor.

Om programmet startas via ett shell-script så kan man låta inställningarna definieras av shell-variabler. Filen kan då se ut som
PORT=666
LAST_DIR=/home/david/musik
Man kan sätta omgivningsvariabler genom att bara sourca filen och de är sedan åtkomliga i resten av scriptet och applikationen (om variablerna exporteras).

Ett shell-script kan ändra vissa värden med sed eller perl
perl -i -pe "s/^PORT=.*/PORT=$NEWPORT/" ~/.konfigfil
Man kan välja att ha konfigfilen i xml-syntax (obs, det här tycker jag är äckligt, ursäkta om jag snabbar förbi här). De flesta språk har nåt xml-bibliotek för att läsa och skriva xml.

Om programmet är skrivet i python, javascript eller lisp, så finns det utmärkt stöd för att seriallisera datastrukturer inbyggt i språket. Skriv ut datastrukturen till en fil, och läs in datastrukturen till en variabel.

För javascript kallas filtypen för serialliserade data "json". Exempel
{"PORT": 666,
"LAST_DIR": "/home/david/musik"}
Exempel python (väldigt likt json om man väljer hashtabell)
{'PORT': 666, 'LAST_DIR': '/home/david/musik'}
(fri white space i json och python, inte så bra om man ska redigera filen med perl och sed.)

EDIT: syntax
Användarvisningsbild
HOLMEN
Fadder
Inlägg: 1724
Blev medlem: 29 mar 2006, 22:39
OS: Ubuntu
Utgåva: Vet inte/ingen utgåva passar
Ort: Göteborg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av HOLMEN »

Tack för det! Det är Python och Bash som programet är skrivet i. Huvudsak i Bash för bakänden.

Inställningsfilen kan se ut såhär (är det tänkt):
tray = true
gui = false

Och så beroende på om det är sant eller falskt så ska det gämföras med i en if-else-sats och sedan köras;

if { tray == true }; then
echo "Tray ska visas."
else
echo " Ingen tray."
elif
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av Osprey »

Eftersom inställningsfilen följer bash-standard så kan du helt enkelt bara köra den och använda dig direkt av resultatet utan att läsa från den. Körningen gör du isåfall med "source" eller "."
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av Konservburk »

HOLMEN skrev:Tack för det! Det är Python och Bash som programet är skrivet i. Huvudsak i Bash för bakänden.

Inställningsfilen kan se ut såhär (är det tänkt):
tray = true
gui = false

Och så beroende på om det är sant eller falskt så ska det gämföras med i en if-else-sats och sedan köras;

if { tray == true }; then
echo "Tray ska visas."
else
echo " Ingen tray."
elif
Då kan du göra som David och Osprey föreslagit. En config fil som ser ut så här:

Kod: Markera allt

TRAY=true
GUI=false
Och sedan i skriptet:

Kod: Markera allt

source din_config-fil

if $TRAY
then
   echo "Tray ska visas."
else
   echo " Ingen tray."
elif
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av David Andersson »

elif
fi naturligtvis </besservisser>
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av Konservburk »

David Andersson skrev:
elif
fi naturligtvis </besservisser>
haha :D HOLMEN lurade mig.

...så går det när man varken läser eller testar koden.
Användarvisningsbild
HOLMEN
Fadder
Inlägg: 1724
Blev medlem: 29 mar 2006, 22:39
OS: Ubuntu
Utgåva: Vet inte/ingen utgåva passar
Ort: Göteborg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument?

Inlägg av HOLMEN »

Haha, förlåt. Borde avslutat satsen. Tack för hjälpen. Har tilllämpat koden, men inte testat än. Markerar som löst.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument? [löst]

Inlägg av Osprey »

Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:

Kod: Markera allt

cat filename | sed 's/gui=false/gui=true/g' > filename
Skrev detta i all hast nu, så det kan finnad brister.......
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Läsa och skriva enskilda rader i ett dokument? [löst]

Inlägg av David Andersson »

Osprey skrev:Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:

Kod: Markera allt

cat filename | sed 's/gui=false/gui=true/g' > filename
Skrev detta i all hast nu, så det kan finnad brister.......
T.ex, det fungerar inte. ;)

Det verkar som det andra komandot hinner skriva över filen innan det första börjat läsa. Man ska alltid tänka sig för när man tänker läsa och skriva samma fil, om skrivaren kan hinna ifatt läsaren, vilket beror på hur det buffras och hur mycket man ändrar. I detta fall är det nog nåt annat, kanske i vilken ordning filen öppnas, men filen blir tom.

Så nu gör jag reklam för -i
Finns till perl och sed.
Exempel

Kod: Markera allt

sed -i 's/^gui=false/gui=true/g' filename
Då är det garanterat att funka oavsett hur stor filen är och hur stora ändringarna är. (Den använder en temporär fil så det inte läses och skrives till samma fil samtidigt.)
Användarvisningsbild
HOLMEN
Fadder
Inlägg: 1724
Blev medlem: 29 mar 2006, 22:39
OS: Ubuntu
Utgåva: Vet inte/ingen utgåva passar
Ort: Göteborg
Kontakt:

Re: Läsa och skriva enskilda rader i ett dokument? [löst]

Inlägg av HOLMEN »

David Andersson skrev:
Osprey skrev:Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:

Kod: Markera allt

cat filename | sed 's/gui=false/gui=true/g' > filename
Skrev detta i all hast nu, så det kan finnad brister.......
T.ex, det fungerar inte. ;)

Det verkar som det andra komandot hinner skriva över filen innan det första börjat läsa. Man ska alltid tänka sig för när man tänker läsa och skriva samma fil, om skrivaren kan hinna ifatt läsaren, vilket beror på hur det buffras och hur mycket man ändrar. I detta fall är det nog nåt annat, kanske i vilken ordning filen öppnas, men filen blir tom.

Så nu gör jag reklam för -i
Finns till perl och sed.
Exempel

Kod: Markera allt

sed -i 's/^gui=false/gui=true/g' filename
Då är det garanterat att funka oavsett hur stor filen är och hur stora ändringarna är. (Den använder en temporär fil så det inte läses och skrives till samma fil samtidigt.)

Tackar, det funkar PERFEKT!
Skriv svar

Återgå till "Terminalforum"