Eu tenho um comando que gera linhas infinitas neste formato:
$cmd1
word1 text with spaces and so on
word2 another text with spaces and so on
Quero passar cada linha para outro comando para que a primeira word
seja passada para um argumento e o restante do texto seja passado para outro argumento. igual a:
$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"
Responder1
Supondo que a linha final tenha uma nova linha (caso contrário, essa linha será perdida) e que cmd2
esteja definida como algo sensato, um calço de código shell pode parecer algo como
#!/bin/sh
IFS=" "
while read word andtherest; do
$cmd2 --argword="$word" --argtext="$andtherest"
done
já que os campos restantes devem ser agrupados andtherest
de acordo com o read
comportamento.
Responder2
Tente um pouco estranho:
/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 nome paracmd2.
Você pode testar desta forma:
$ 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"