我有一个命令,可以输出这种格式的无限行:
$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
设置为合理的值,shell 代码拼凑的垫片可能看起来像这样
#!/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 变量作为名称指令2。
你可以这样测试:
$ 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"