![передача нескольких аргументов через канал](https://rvso.com/image/111999/%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB.png)
У меня есть команда, которая выводит бесконечное количество строк такого формата:
$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"