次の形式で無制限の行を出力するコマンドがあります。
$cmd1
word1 text with spaces and so on
word2 another text with spaces and so on
word
最初の行が1つのパラメータに渡され、残りのテキストが別のパラメータに渡されるように、各行を別のコマンドに渡したいと思います。このように:
$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"
答え1
最後の行に改行文字があり(そうでなければ行が失われます)、cmd2
合理的な値に設定されていると仮定すると、shimを一緒にまとめたシェルコードは次のようになります。
#!/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"