Sida 1 av 1
Kommer inte överens med sed… [LÖST]
Postat: 13 nov 2010, 13:44
av Johnny Rosenberg
Jag kan nästan svära på att detta fungera för bara några dagar sedan, men tydligen inte då:
Kod: Markera allt
#!/bin/bash
Line="ord Ord" # Tab mellan ord och Ord
Test="$(echo -e $Line | sed 's/\t.*//')"
Replace="$(echo -e $Line | sed 's/.*\t//')"
echo "Line=$Line → Test=$Test, Replace=$Replace"
Vill ha följande resultat:
Line=ord Ord → Test=ord, Replace=Ord
Faktiskt resultat:
Line=ord Ord → Test=ord Ord, Replace=ord Ord
Har som sagt testat detta förut och då har det fungerat, men uppenbarligen har jag ändrat något sedan dess, men jag kan inte se vad…
Hjälp…!

Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 13:51
av ubot
Det här fungerar:
Kod: Markera allt
#!/bin/bash
Line="ord Ord" # Tab mellan ord och Ord
Test="$(echo -e $Line | sed 's/\ .*//')"
Replace="$(echo -e $Line | sed 's/.*\ //')"
echo "Line=$Line → Test=$Test, Replace=$Replace"
Du har inte en tabb utan tre blanksteg mellan ord och Ord. Därför träffar såklart inte sed. Programmet (Gedit?) som har skrivit "ord Ord" kanske har ersatt tabb med tre blanksteg. Jag brukar ändra en sådan inställning när jag skriver Python-kod med då 4 blanksteg istället för tabb för indentering av koden på Python-vis.
Lösningen är att ersätta tre blanksteg med en riktig tabb i variabeln $Line eller att ersätta \t i sed med ett (eller tre) blanksteg (som jag har gjort).
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:12
av Johnny Rosenberg
Har minskat ner problemet nu och funnit att det består i att sed inte bryr sig om ”\t”. Har även testat med ”\x09” men inte heller det funkar.
Har kollat i ghex2 att det verkligen är ett tabtecken mellan orden.
Letade på nätet lite och fick ett tips som gav denna kod, men inte heller den fungerar:
Kod: Markera allt
#!/bin/bash
Line="ord Ord"
tab=$(echo a | tr a '\t')
echo -e $Line | sed "s/$tab//"
echo -e $Line | sed "s/$tab//"
Resultat:
ord Ord
Till sist testade jag detta:
Kod: Markera allt
#!/bin/bash
tab=$(echo a | tr a '\t')
Line="ord$tabOrd"
echo -e $Line | sed "s/$tab//"
echo -e $Line | sed "s/$tab//"
Nu blev resultatet följande:
ord
ord
Inte heller helt väntat, tycker jag…
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:13
av Johnny Rosenberg
ubot skrev:Det här fungerar:
Kod: Markera allt
#!/bin/bash
Line="ord Ord" # Tab mellan ord och Ord
Test="$(echo -e $Line | sed 's/\ .*//')"
Replace="$(echo -e $Line | sed 's/.*\ //')"
echo "Line=$Line → Test=$Test, Replace=$Replace"
Du har inte en tabb utan tre blanksteg mellan ord och Ord. Därför träffar såklart inte sed. Programmet (Gedit?) som har skrivit "ord Ord" kanske har ersatt tabb med tre blanksteg. Jag brukar ändra en sådan inställning när jag skriver Python-kod med då 4 blanksteg istället för tabb för indentering av koden på Python-vis.
Lösningen är att ersätta tre blanksteg med en riktig tabb i variabeln $Line eller att ersätta \t i sed med ett (eller tre) blanksteg (som jag har gjort).
Enligt ghex2 är det ett tab-tecken, inte tre blanksteg. Det verkar ha konverterats till blanksteg här på forumet på något sätt.
Har kollat inställningarna i gedit också, och konvertera till mellanslag är
inte ibockad.
När jag promenerar runt i filen med piltangenterna kan jag också se att det bara är
ett tecken, inte tre. Dessutom har jag satt tab-längden till 4 tecken och inte tre, så inget stämmer med just tre blanksteg här, förutom att det råkade bli det här på forumet.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:21
av Konservburk
Johnny Rosenberg skrev:Jag kan nästan svära på att detta fungera för bara några dagar sedan, men tydligen inte då:
Kod: Markera allt
#!/bin/bash
Line="ord Ord" # Tab mellan ord och Ord
Test="$(echo -e $Line | sed 's/\t.*//')"
Replace="$(echo -e $Line | sed 's/.*\t//')"
echo "Line=$Line → Test=$Test, Replace=$Replace"
Vill ha följande resultat:
Line=ord Ord → Test=ord, Replace=Ord
Faktiskt resultat:
Line=ord Ord → Test=ord Ord, Replace=ord Ord
Har som sagt testat detta förut och då har det fungerat, men uppenbarligen har jag ändrat något sedan dess, men jag kan inte se vad…
Hjälp…!

För mig ser det ut som att du har problem med
fnuttologin igen. Det gäller dessa två rader:
Kod: Markera allt
Test="$(echo -e $Line | sed 's/\t.*//')"
Replace="$(echo -e $Line | sed 's/.*\t//')"
De borde se ut så här istället:
Kod: Markera allt
Test=$(echo -e "$Line" | sed 's/\t.*//')
Replace=$(echo -e "$Line" | sed 's/.*\t//')
Annars översätter skalet dina tab-tecken till vanliga mellanrum innan de ens når fram till
sed.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:27
av Johnny Rosenberg
Konservburk skrev:För mig ser det ut som att du har problem med
fnuttologin igen. Det gäller dessa två rader:
Kod: Markera allt
Test="$(echo -e $Line | sed 's/\t.*//')"
Replace="$(echo -e $Line | sed 's/.*\t//')"
De borde se ut så här istället:
Kod: Markera allt
Test=$(echo -e "$Line" | sed 's/\t.*//')
Replace=$(echo -e "$Line" | sed 's/.*\t//')
Annars översätter skalet dina tab-tecken till vanliga mellanrum innan de ens når fram till
sed.
Tack! Där satt den!
Det stämmer med att det fungerade för några dagar sedan också, för då såg raderna ut så här:
Test=$(echo -e $Line | sed 's/\t.*//')
Replace=$(echo -e $Line | sed 's/.*\t//')
Min tanke, som visade sig vara alltför snabb, var att citat-tecknen skulle få det hela att fungera, inte bara på ord utan även på fraser med mellanslag.
Ska säga direkt att jag tycker det är ganska svårt, just det där med ”fnuttologin”, så jag kommer säkert att ramla ner i samma fälla igen några gånger innan jag fattat det hela…

Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:31
av Konservburk
Johnny Rosenberg skrev:Letade på nätet lite och fick ett tips som gav denna kod, men inte heller den fungerar:
Kod: Markera allt
#!/bin/bash
Line="ord Ord"
tab=$(echo a | tr a '\t')
echo -e $Line | sed "s/$tab//"
echo -e $Line | sed "s/$tab//"
Resultat:
ord Ord
Samma problem här, du måste ha dubbelfnuttar runt dina
$Line om det ska fungera som du tänkt dig.
Johnny Rosenberg skrev:Till sist testade jag detta:
Kod: Markera allt
#!/bin/bash
tab=$(echo a | tr a '\t')
Line="ord$tabOrd"
echo -e $Line | sed "s/$tab//"
echo -e $Line | sed "s/$tab//"
Nu blev resultatet följande:
ord
ord
Inte heller helt väntat, tycker jag…
Här har du dessutom ett problem med raden:
Det där blir ordet
ord följt av variabeln
$tabOrd som är helt tom. Lösningen är att skriva variablen som
${tab} istället så här:
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:37
av ubot
Det hela är väl så "enkelt" att om du vill att echo ska spotta ut innehållet i variablen som en textsträng så måste du omsluta variablen med (").
Jag sitter just nu och lär mig PHP och där gäller att echo "$var"; parsar html-kod i $var men echo '$var'; gör inte det. Om jag inte minns helt fel...
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:44
av Johnny Rosenberg
Konservburk skrev:Här har du dessutom ett problem med raden:
Det där blir ordet
ord följt av variabeln
$tabOrd som är helt tom. Lösningen är att skriva variablen som
${tab} istället så här:
Jo, det vet jag ju egentligen, så det var nog mest att jag var lite extra klantig just där… Det kan ju bli så när det börjat snurra ordentligt i huvudet…

Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 14:47
av Konservburk
Johnny Rosenberg skrev:Ska säga direkt att jag tycker det är ganska svårt, just det där med ”fnuttologin”, så jag kommer säkert att ramla ner i samma fälla igen några gånger innan jag fattat det hela…

Stalltipset är att alltid sätta dubbelfnuttar runt alla variabler varje gång du inte vet hur det egentligen ska vara.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:05
av ubot
Det heter fnuttfnutt eller citationstecken INTE dubbelfnuttar.
Jag hittade det här:
Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see section 3.5 Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed.
(") bevarar "literal value". Det tycker jag är en bra sammanfattning.

Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:33
av Konservburk
ubot skrev:Det hela är väl så "enkelt" att om du vill att echo ska spotta ut innehållet i variablen som en textsträng så måste du omsluta variablen med (").
Jag sitter just nu och lär mig PHP och där gäller att echo "$var"; parsar html-kod i $var men echo '$var'; gör inte det. Om jag inte minns helt fel...
Skillnaden här är att förutom
'$var' och
"$var" så är även bara
$var utan några funttar helt giltig syntax.
Så här fungerar det:
'$var' ersätts med den exakta strängen som står inom enkelfnuttarna, dvs texten
$var i det här fallet.
"$var" ersätts med innehållet i variabeln
$var som
en enda sträng, vilket är vad de flesta nästan alltid vill ska hända.
$var utan fnuttar ersätts med innehållet i variabeln
$var som en
eller flera strängar med ett vanligt mellanrum mellan varje sträng. Uppdelningen sker vid vanliga mellanrum, tab och nyrad. Dessa skiljetecken går att ändra genom att sätta variabeln
$IFS till andra skiljetecken.
Anledningen till att många har problem med
fnuttologin är att att
$var och
"$var" ger precis samma resultat så länge som variabeln
$var inte innehåller något av tecken som finns i variabeln
$IFS.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:37
av Johnny Rosenberg
ubot skrev:Det heter fnuttfnutt eller citationstecken INTE dubbelfnuttar.

Fast numera säger man ju hellre ”citat-tecken”. Det är lika korrekt som ”citationstecken” men mer logiskt. Hade man använt det ordet från början så hade nog inte folk gått omkring i total ovetskap och sagt absurda saker som ”situationstecken”…
Och tack för alla tips och all hjälp. Det verkar som att mitt skript fungerar nu, alltså inte bara den lilla del av skriptet jag tog upp här i denna tråd, utan även resten av skriptet. Dock är det inte klart då jag kommit på att jag behöver utöka det ytterligare, så det kommer kanske fler frågor senare, vad vet jag? Förhoppningsvis har jag förstått det mesta nu i alla fall.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:41
av ubot
IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken men hjälp får man så det räcker och blir över.

Ett tips bara om du inte får ihop dina bash-skript och om vi inte löser problemet smidigt för dig.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:53
av Konservburk
ubot skrev:IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken
Vilken regelbok? På andra ställen blir du minst lika utskälld om du använder bashismer istället för mer portabel bourne-kod.
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 15:58
av Johnny Rosenberg
Konservburk skrev:ubot skrev:IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken
Vilken regelbok? På andra ställen blir du minst lika utskälld om du använder bashismer istället för mer portabel bourne-kod.
För min del kommer jag nog helt enkelt att fråga efter en länk till ”regelboken” om jag skulle bli utskälld… Det är ju svårt att följa regler man inte känner till… Kanske ska googla lite efter ”bash rules” eller liknande…
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 16:32
av ubot
Konservburk skrev:ubot skrev:IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken
Vilken regelbok? På andra ställen blir du minst lika utskälld om du använder bashismer istället för mer portabel bourne-kod.
I #bash länkar dom till:
http://tldp.org/LDP/abs/html/
Det är alltså det som är "regelboken".
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 19:35
av Johnny Rosenberg
ubot skrev:Konservburk skrev:ubot skrev:IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken
Vilken regelbok? På andra ställen blir du minst lika utskälld om du använder bashismer istället för mer portabel bourne-kod.
I #bash länkar dom till:
http://tldp.org/LDP/abs/html/
Det är alltså det som är "regelboken".
Tackar! Den är nu bokmärkt i min webbläsare!
Re: Kommer inte överens med sed…
Postat: 13 nov 2010, 22:09
av ubot
Johnny Rosenberg skrev:ubot skrev:Konservburk skrev:ubot skrev:IRC-kanalen #bash är grymt bra. Du kommer få en och annan "utskällning" om du inte skriver bash-kod som man ska enligt regelboken
Vilken regelbok? På andra ställen blir du minst lika utskälld om du använder bashismer istället för mer portabel bourne-kod.
I #bash länkar dom till:
http://tldp.org/LDP/abs/html/
Det är alltså det som är "regelboken".
Tackar! Den är nu bokmärkt i min webbläsare!
Du gör rätt som bokmärker länken. Den är en klassiker.