Kommer inte överens med sed… [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Kommer inte överens med sed… [LÖST]

Inlägg 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…! :o
Senast redigerad av 1 Johnny Rosenberg, redigerad totalt 13 gånger.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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).
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kommer inte överens med sed…

Inlägg 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…! :o
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.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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…
;D
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kommer inte överens med sed…

Inlägg 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:

Kod: Markera allt

Line="ord$tabOrd"
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:

Kod: Markera allt

Line="ord${tab}Ord"
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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...
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg av Johnny Rosenberg »

Konservburk skrev:Här har du dessutom ett problem med raden:

Kod: Markera allt

Line="ord$tabOrd"
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:

Kod: Markera allt

Line="ord${tab}Ord"
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…
;D
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kommer inte överens med sed…

Inlägg 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…
;D
Stalltipset är att alltid sätta dubbelfnuttar runt alla variabler varje gång du inte vet hur det egentligen ska vara.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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. :)
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kommer inte överens med sed…

Inlägg 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.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kommer inte överens med sed…

Inlägg 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.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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".
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Kommer inte överens med sed…

Inlägg 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!
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kommer inte överens med sed…

Inlägg 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.
Skriv svar

Återgå till "Terminalforum"