command echo in script con input da excel.txt file

Primo: Molte grazie per aver preso gli sforzi per leggere e rispondere a questo post

Cosa voglio fare:

Vorrei leggere le righe da un file txt (each row potrebbe contenere 1 o 2 parole) e poi echeggiare un text che dice:

curl "text.word1 + word2"

Come faccio io :

while read line do kw=( $line ) echo 'curl "text.'${kw[0]}+${kw[1]}'"' done 

Nota: ci sono ulteriori comandi nel mio file che non ho postato qui

Problema

Mentre questo funziona bene quando lo esegue nel terminal e inserisco una linea nel terminal, non produce il risultato desiderato quando utilizzo un file txt come input

Il file di text è un file excel in cui ho text nella prima colonna. Salvo il file excel come "il text formattato di Windows (.txt) e posso aprire il file name.txt risultante in un editor (vedendo un file di text" normale ")

quando uso nel terminal ora

 ./myscript.command < name.txt 

il risultato sarà

"url" text.word1 + word2 invece di curl "text.word1 + word2"

Qualche idea su come risolvere questo problema?

Grazie molto!

${kw[1]} ha un carattere di return a capo alla fine di esso, quello che stai vedendo è:

 curl "text.word1+word2 " 

con la seconda row che sovrascrive il primo.

È ansible confermare questa operazione eseguendo un dump esadecimale nel file, ad esempio con:

 od -xcb name.txt 

e alla ricerca di quei caratteri fastidiosi.

La seguente trascrizione mostra in dettaglio:

 pax> od -xcb name.txt 0000000 6150 2078 6944 6261 6f6c 0a0d P ax D iablo \r \n 120 141 170 040 104 151 141 142 154 157 015 012 0000014 pax> cat name.sh #!/bin/bash while read line ; do kw=( $line ) echo 'curl "text.'${kw[0]}+${kw[1]}'"' done <name.txt pax> ./name.sh "url "text.Pax+Diablo 

Per quanto riguarda il modo in cui sbarazzate del return di carri, ci sono numerose soluzioni, alcune delle quali sono:

  • dos2unix ;
  • tr -d '\r' ; o
  • sed 's/\r$//' .

La tua arma di scelta dipende da quali strumenti avete a disposizione, dos2unix è probabilmente il più semplice se lo hai a portta di mano.

DOS utilizza CRLF per la nuova linea (each row termina con due caratteri, CR quindi LF). Unix utilizza solo LF (each row termina con un carattere \ n).

Per convertire il formato del file dos in un formato di file unix

 $ dos2unix filename 

Risolverà il tuo problema.

Questo codice funziona bene:

 while read line do kw=( $line ) echo 'curl "text.'${kw[0]}+${kw[1]}'"' done < $1 

E genera:

 ./text_line.sh text.txt curl "text.aaa+aaa" curl "text.bbb+bbb" curl "text.ccc+" curl "text.ddd+ddd"