Läsa och skriva enskilda rader i ett dokument? [löst]
- 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]
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?
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.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Läsa och skriva enskilda rader i ett dokument?
Både sed och awk är bra på sånt.
- 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?
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.
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Läsa och skriva enskilda rader i ett dokument?
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
Ett shell-script kan ändra vissa värden med sed eller perl
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
EDIT: syntax
Om programmet startas via ett shell-script så kan man låta inställningarna definieras av shell-variabler. Filen kan då se ut som
Man kan sätta omgivningsvariabler genom att bara sourca filen och de är sedan åtkomliga i resten av scriptet och applikationen (om variablerna exporteras).PORT=666
LAST_DIR=/home/david/musik
Ett shell-script kan ändra vissa värden med sed eller perl
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.perl -i -pe "s/^PORT=.*/PORT=$NEWPORT/" ~/.konfigfil
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
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.){'PORT': 666, 'LAST_DIR': '/home/david/musik'}
EDIT: syntax
- 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?
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
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
- 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?
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...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Läsa och skriva enskilda rader i ett dokument?
Då kan du göra som David och Osprey föreslagit. En config fil som ser ut så här: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
Kod: Markera allt
TRAY=true
GUI=false
Kod: Markera allt
source din_config-fil
if $TRAY
then
echo "Tray ska visas."
else
echo " Ingen tray."
elif
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Läsa och skriva enskilda rader i ett dokument?
fi naturligtvis </besservisser>elif
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Läsa och skriva enskilda rader i ett dokument?
hahaDavid Andersson skrev:fi naturligtvis </besservisser>elif

...så går det när man varken läser eller testar koden.
- 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?
Haha, förlåt. Borde avslutat satsen. Tack för hjälpen. Har tilllämpat koden, men inte testat än. Markerar som löst.
- 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]
Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:
Skrev detta i all hast nu, så det kan finnad brister.......
Kod: Markera allt
cat filename | sed 's/gui=false/gui=true/g' > filename
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...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Läsa och skriva enskilda rader i ett dokument? [löst]
T.ex, det fungerar inte.Osprey skrev:Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:Skrev detta i all hast nu, så det kan finnad brister.......Kod: Markera allt
cat filename | sed 's/gui=false/gui=true/g' > filename

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
- 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]
David Andersson skrev:T.ex, det fungerar inte.Osprey skrev:Nu har vi pratat om att läsa in info från filen, men att ändra är också ganska lätt, typ:Skrev detta i all hast nu, så det kan finnad brister.......Kod: Markera allt
cat filename | sed 's/gui=false/gui=true/g' > filename
![]()
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.
ExempelDå ä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.)Kod: Markera allt
sed -i 's/^gui=false/gui=true/g' filename
Tackar, det funkar PERFEKT!