передача нескольких аргументов через канал

передача нескольких аргументов через канал

У меня есть команда, которая выводит бесконечное количество строк такого формата:

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

Я хочу передать каждую строку другой команде так, чтобы первая строка wordбыла передана одному аргументу, а остальной текст — другому аргументу. Вот так:

$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"

решение1

Если предположить, что в конечной строке есть символ новой строки (иначе эта строка теряется) и он cmd2установлен на что-то разумное, то слепленная оболочка из кода оболочки может выглядеть примерно так:

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

так как все оставшиеся поля должны быть объединены в andtherestсоответствии с тем, как readсебя ведет.

решение2

Попробуйте немного awk:

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

Этот вывод принимает переменную awk в качестве имени дляcmd2.

Проверить это можно следующим образом:

$ 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"

Связанный контент