![pasar múltiples argumentos a través de una tubería](https://rvso.com/image/111999/pasar%20m%C3%BAltiples%20argumentos%20a%20trav%C3%A9s%20de%20una%20tuber%C3%ADa.png)
Tengo un comando que genera infinitas líneas de este formato:
$cmd1
word1 text with spaces and so on
word2 another text with spaces and so on
Quiero pasar cada línea a otro comando para que la primera word
pase a un argumento y el resto del texto a otro argumento. al igual que:
$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"
Respuesta1
Suponiendo que la línea final tiene una nueva línea (de lo contrario, esa línea se pierde) y que cmd2
está configurada en algo sensato, un código de shell adoquinado podría verse así
#!/bin/sh
IFS=" "
while read word andtherest; do
$cmd2 --argword="$word" --argtext="$andtherest"
done
ya que todos los campos sobrantes deben agruparse andtherest
según cómo read
se comporta.
Respuesta2
Prueba un poco extraño:
/usr/bin/awk -f
{
cmd=$1;
gsub($1 " +", "")
printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0)
}
Esa salida acepta una variable awk como nombre paracmd2.
Puedes probarlo de esta manera:
$ echo "word1 text with spaces and so on" |
awk -v cmd2=foo '{ cmd=$1; gsub($1 " +", ""); printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0) }'
foo --argword=word1 --argtext="text with spaces and so on"