Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Uprava řetězce na počet znaků. [Vyřešeno]  (Přečteno 3127 krát)

Cendas

Uprava řetězce na počet znaků. [Vyřešeno]
« kdy: 02 Ledna 2012, 13:04:42 »
Ahoj potřeboval když mám proměnou ke je název dne tak ji upravit aby měl vždy stejný počet znaků tedy aby se chybějící doplnili mezerami. Tedy aby úterý mělo stejný počet znaků jako pondělí.
Kód: [Vybrat]
#!/bin/bash
DAY_0=`date -d "2012-01-03"  +%A`
echo $DAY_0
exit
« Poslední změna: 04 Ledna 2012, 10:18:35 od Cendas »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Uprava řetězce na počet znaků.
« Odpověď #1 kdy: 02 Ledna 2012, 13:52:05 »
To nejjednoduší, co mě napadá:

Kód: [Vybrat]
DAY_0="`date -d "2012-01-03"  +%A`   "
echo ${DAY_0:0:7}
« Poslední změna: 02 Ledna 2012, 13:56:21 od GdH »

daysleeper

  • Stálý člen
  • **
  • Příspěvků: 1206
Re:Uprava řetězce na počet znaků.
« Odpověď #2 kdy: 02 Ledna 2012, 14:40:52 »
Znaků nebo bytů?

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:Uprava řetězce na počet znaků.
« Odpověď #3 kdy: 02 Ledna 2012, 15:37:28 »
Znaků nebo bytů?
dobre, predpokladejme ze mam problemy se ctenim a jsou to bytes .., co s tim tedy udelas ?
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re:Uprava řetězce na počet znaků.
« Odpověď #4 kdy: 02 Ledna 2012, 18:57:31 »
zrovna jsem, než napsal GdH odpověď, dumal jak sakra přinutit printf aby to bral po znaku a ne po bytu... takže
Kód: [Vybrat]
printf "%-9s" $DAY_0

Cendas

Re:Uprava řetězce na počet znaků.
« Odpověď #5 kdy: 03 Ledna 2012, 09:58:08 »
zrovna jsem, než napsal GdH odpověď, dumal jak sakra přinutit printf aby to bral po znaku a ne po bytu... takže
Kód: [Vybrat]
printf "%-9s" $DAY_0
Díky použil jsem tohle a funguje to.  :)

daysleeper

  • Stálý člen
  • **
  • Příspěvků: 1206
Re:Uprava řetězce na počet znaků.
« Odpověď #6 kdy: 03 Ledna 2012, 10:32:52 »
funguje to.  :)
Jak to? printf doplňuje zrovna na počet bytů, ne znaků:
Kód: [Vybrat]
$ for i in pondělí úterý středa čtvrtek pátek sobota neděle čřžěšč; do printf "%-12sahoj\n" "$i"; done
pondělí   ahoj
úterý     ahoj
středa     ahoj
čtvrtek    ahoj
pátek      ahoj
sobota      ahoj
neděle     ahoj
čřžěščahoj
druhý sloupec není zarovnaný, protože počet znaků je různý, narozdíl od bash substituce (GdH):
Kód: [Vybrat]
$ for i in pondělí úterý středa čtvrtek pátek sobota neděle čřžěšč; do i+="             "; echo "${i:0:12}ahoj"; done
pondělí     ahoj
úterý       ahoj
středa      ahoj
čtvrtek     ahoj
pátek       ahoj
sobota      ahoj
neděle      ahoj
čřžěšč      ahoj

Cendas

Re:Uprava řetězce na počet znaků.
« Odpověď #7 kdy: 03 Ledna 2012, 11:08:34 »
Když mě právě tohle píše chybu: echo ${DAY_0:0:7}
Dám to sem celé jak to mám.
Tady je ten script.
Kód: [Vybrat]
#!/bin/bash

FORECAST_FILE=forecast.txt

for pn in $(seq 0 4); do
  eval `sed -n 's/.*<time from="\([^T]*\).*/DATE=\1/;'$pn'1p' $FORECAST_FILE`
  eval 'DAY_'$pn'='`date -d $DATE +%A`
done
echo $DAY_0'I'
echo $DAY_1'I'
echo $DAY_2'I'
echo $DAY_3'I'
echo $DAY_4'I'
exit
V příloze je soubor ze kterého načítám vstupní data.
Ještě jsem přemýšlel nad tím jak místo proměnné $DATE tam vložit ten příkaz sed ale nepodařilo se mi na to přijít.
Jde to sice takhle ale pak už mi před to nejde dát ten eval.
Kód: [Vybrat]
date -d`sed -n 's/.*<time from="\([^T]*\).*/DATE=\1/;'$pn'1p' $FORECAST_FILE` +%A
[příloha smazaná administrátorem]
« Poslední změna: 03 Ledna 2012, 11:31:45 od Cendas »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Uprava řetězce na počet znaků.
« Odpověď #8 kdy: 03 Ledna 2012, 13:09:52 »
Kód: [Vybrat]
#!/bin/bash

for pn in $(seq 0 4); do
  DAY="`sed -n 's/.*<time from="\([^T]*\).*/\1/;'$pn'1p' forecast.txt |xargs -I i date -d i +%A`   "
  echo "${DAY:0:8}I"
done
exit

Trochu jsem to zjednodušil.

Cendas

Re:Uprava řetězce na počet znaků.
« Odpověď #9 kdy: 03 Ledna 2012, 13:27:44 »
Mě to takhle píše chybu:
Tohle mi nechce fungovat: echo "${DAY:0:8}I"
pokus.sh: 10: Bad substitution

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Uprava řetězce na počet znaků.
« Odpověď #10 kdy: 03 Ledna 2012, 14:02:51 »
Mě to takhle píše chybu:
Tohle mi nechce fungovat: echo "${DAY:0:8}I"
pokus.sh: 10: Bad substitution

Nefunguje to v DASHi (/bin/sh), ale pokud máš skript uvozen #!/bin/bash, tak by neměl být problém. Nesmíš ho ale spouštět tímto:
Kód: [Vybrat]
sh pokus.shale jednou z následujících možností:
Kód: [Vybrat]
./pokus.sh
bash pokus.sh
« Poslední změna: 03 Ledna 2012, 14:07:00 od GdH »

Cendas

Re:Uprava řetězce na počet znaků.
« Odpověď #11 kdy: 04 Ledna 2012, 08:36:28 »
Ahoj dík to jsem nevěděl tak jsem to zkusil udělat takhle ale přidá to znaky ale mezera nejde.
Kód: [Vybrat]
for pn in $(seq 0 4); do
  eval `sed -n 's/.*<time from="\([^T]*\).*/DATE=\1/;'$pn'1p' $FORECAST_FILE`
  eval 'DAY_'$pn'='`date -d $DATE +%A',,,'`
done

echo ${DAY_0:0:7}'I'
echo ${DAY_1:0:7}'I'
echo ${DAY_2:0:7}'I'
echo ${DAY_3:0:7}'I'
echo ${DAY_4:0:7}'I'
exit

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Uprava řetězce na počet znaků.
« Odpověď #12 kdy: 04 Ledna 2012, 09:57:52 »
Funkční skript jsem ti napsal, zamysli se nad uvozovkama.

Cendas

Re:Uprava řetězce na počet znaků.
« Odpověď #13 kdy: 04 Ledna 2012, 10:12:50 »
Dík máš pravdu stačilo to dát do uvozovek.
Mezery mě to bere taky. Stačilo tam dát zpětné lomítko.  :)
Kód: [Vybrat]
eval 'DAY_'$pn'='`date -d $DATE +%A'\ \ \ '`

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Uprava řetězce na počet znaků. [Vyřešeno]
« Odpověď #14 kdy: 04 Ledna 2012, 10:45:43 »
A vykašli se na ten eval, to jsem ti radil jako fintu v daném případě, ne jako standardní cestu pro práci s proměnnými. Když ti nestačí to rovnou vypisovat a musíš to strkat do proměnných, raději použij pole:

Kód: [Vybrat]
#!/bin/bash

for pn in $(seq 0 4); do
  DAY[$pn]="`date -d $(sed -n 's/.*<time from="\([^T]*\).*/\1/;'$pn'1p' forecast.txt) +%A`   "
done

echo "${DAY[0]:0:7}I"
echo "${DAY[1]:0:7}I"
echo "${DAY[2]:0:7}I"
echo "${DAY[3]:0:7}I"
echo "${DAY[4]:0:7}I"

exit

Minule jsem použil zbytečně xargs, tohle je rychlejší ;)
« Poslední změna: 04 Ledna 2012, 10:48:00 od GdH »

Cendas

Re:Uprava řetězce na počet znaků. [Vyřešeno]
« Odpověď #15 kdy: 04 Ledna 2012, 11:44:55 »
Zkusil jsem to udělat jak píšeš ale pak mě to dělá chyby proměnných v conky pro stupně, to bych pak taky musel předělat.
Do přílohy jsem dal celí ten script, kdyby se ti chtělo se na to kouknout, ale není to nutné funguje to i takhle dobře.


[příloha smazaná administrátorem]
« Poslední změna: 04 Ledna 2012, 12:08:00 od Cendas »

 

Provoz zaštiťuje spolek OpenAlt.