passando por vários argumentos através de um pipe

1

Eu tenho um comando que gera linhas infinitas desse formato:

$cmd1
word1 text with spaces and so on
word2 another text with spaces and so on

Eu quero passar cada linha para outro comando para que o primeiro word seja passado para um argumento e o restante do texto seja passado para outro argumento. assim:

$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"
    
por microo8 22.05.2017 / 19:59

2 respostas

2

Assumindo que a linha final tem uma nova linha (caso contrário, essa linha será perdida) e que cmd2 é definido como algo sensato, um shim com código shell pode parecer algo como

#!/bin/sh
IFS=" "
while read word andtherest; do
    $cmd2 --argword="$word" --argtext="$andtherest"
done

como os campos restantes devem ser todos agrupados em andtherest de como read se comporta.

    
por 22.05.2017 / 20:39
0

Tente um pouco de awk:

/usr/bin/awk -f
{
    cmd=$1;
    gsub($1 " +", "")
    printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0)
}

Essa saída aceita uma variável awk como o nome para cmd2 .

Você pode testá-lo desta maneira:

$ 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"
    
por 22.05.2017 / 23:50