pasar múltiples argumentos a través de una tubería

pasar múltiples argumentos a través de una tubería

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 wordpase 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 cmd2está 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 andtherestsegún cómo readse 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"

información relacionada