Newsgroup: it.comp.os.linux.iniziare
Titolo: [Dialog]: problemi con --checklist e opzioni contenenti spazi

Probabilmente mi sto perdendo in un bicchier d'acqua, ma vi
chiedo ugualmente...
allora ho un file di testo tipo il seguente
a 1
b 2
c 3
d 4
ciò che conta è che ciascuna riga rappresenta una opzioone da
scegliere che come si vede contiene uno spazio.
Sto cercando di fare una checklist con dialog in modo da poter
modificare quel file di input togliendo le righe che non voglio.
Di default devono essere tutte mantenute e l'utente deselezionerà
solo quelle che non vuole. Spero di essermi spiegato, ma per
completessa vi posto un pezzo di script.
INLIST=`cat $LIST |sed 's/.*/& ~ on/'`
TMPFILE=$(tempfile)
dialog \
  --separate-output \
  --title "SELEZIONE FILES" \
  --checklist "Quali files sacrico?" \
              0 0 0 \
              $INLIST 2> $TMPFILE
retval=$?
case $retval in
	0)
	  clear
	  echo "OK pressed."
	  cp $TMPFILE $LIST;;
	1)
	  clear
	  echo "Cancel pressed.";;
        255)
          clear
	  echo "ESC pressed.";;
esac
rm $TMPFILE
echo
cat $LIST
read
in pratica il file $LIST contenente la lista descritta sopra
viene aggiornato togliendo le righe deselezionate dall'utente.
Quindi se per esempio l'utente deseleziona la prima e la terza
riga, allora la nuova lista deve essere:
b 2
d 4
Penso di essermi spiegato...
Ora, il problema è lo spazio che contiene ciascuna riga della
lista.
Usando sed come sopra capita che a dialog vengano dati gli
argmenti in modo sballato. Anche mettendo le virgolette:
INLIST=`cat $LIST |sed 's/.*/"&" ~ on/'`
non risolvo lo stesso.
Nota:
In questo caso specifico visto che ciascuna voce ha uno spazio
solo è come se in pratica la prima parola fosse il "tag" e la
seconda l' "item" (veda il man). questo rende possibile aggirare
l'ostacolo (perchè in questo caso non mi serve inserire un item
particolare, tant'è che vi ho messo il carattere ~) come segue:
INLIST=`cat $LIST |sed 's/.*/& on/'`
in pratica ogni riga sarà così composta proprio da tre argomenti
che esige --checklist: tag item status.
Però se ogni riga avesse avuto due spazi il problema si
ripresenterebbe, quindi la domanda resta: come "escapare" gli
spazi contenuti nei tag?

 INLIST=`cat $LIST |sed 's/.*/& on/'`
No...mi sono sbagliato, così si risolve nel senso cah
l'interfacia funge, però il file di uscita conterrà solo la prima
parola (cioè il tag) mentre taglia la seconda (considrandola un
item)...
Quindi niente, devo riuscire ad escapare gli spazi.
La cosa strana è che seguendo l'esempio sulla checklist e
modificandolo mettendo degli spazi nei vari tag funziona.
Quindi il  problema diventa la restituzione del valoredella
variabile INLIST forse. Ma anche lì provando dal prompt sembra
giusta finche non la si dà in pasto a dialog..boo.

ciao, forse ho risolto il tuo problema...
l'idea e' quella di cambiare la variabile IFS
$ cat out.txt
1 uno
2 due
3 tre
$ sed 'a ok1\nok2' out.txt > out2.txt
$ cat out2.txt
1 uno
ok1
ok2
2 due
ok1
ok2
3 tre
ok1
ok2
$ ( IFS=$'\n'; dialog --checklist "OK" 0 0 0 `cat out2.txt` )
ho messo le parentesi tonde per evitarmi di limitare la variazione di 
IFS al solo comando in questione...

 IFS al solo comando in questione...
ho scritto una cazzata...  volevo dire
ho messo le parentesi tonde per limitare la variazione di IFS al solo 
comando in questione...

gira gira.. ne ho trovato un'altro.. forse migliore
usando eval
$ cat out.txt
1 uno
2 due
3 tre
$ sed 's/.*/"&"/' out.txt | sed 'a ""\non' > out2.txt
$ cat out2.txt
"1 uno"
""
on
"2 due"
""
on
"3 tre"
""
on
$ eval dialog --checklist "OK" 0 0 0 `cat out2.txt`

> $ sed 's/.*/"&"/' out.txt | sed 'a ""\non' > out2.txt
che sciocco...
chiaro che a questo punto non ti serve piu' andare a capo...
puoi fare con un sed solo, cambiando la riga in
"1 uno" "" on