![Übergeben mehrerer Argumente durch eine Pipe](https://rvso.com/image/111999/%C3%9Cbergeben%20mehrerer%20Argumente%20durch%20eine%20Pipe.png)
Ich habe einen Befehl, der unendlich viele Zeilen in diesem Format ausgibt:
$cmd1
word1 text with spaces and so on
word2 another text with spaces and so on
Ich möchte jede Zeile an einen anderen Befehl übergeben, sodass die erste word
an ein Argument und der Rest des Textes an ein anderes Argument übergeben wird. Und zwar etwa so:
$cmd2 --argword=word1 --argtext="text with spaces and so on"
$cmd2 --argword=word2 --argtext="another text with spaces and so on"
Antwort1
Vorausgesetzt, die letzte Zeile hat einen Zeilenumbruch (sonst geht die Zeile verloren) und dieser cmd2
ist auf einen sinnvollen Wert eingestellt, könnte ein zusammengewürfelter Shellcode-Shim etwa so aussehen:
#!/bin/sh
IFS=" "
while read word andtherest; do
$cmd2 --argword="$word" --argtext="$andtherest"
done
andtherest
da die übrigen Felder alle gemäß dem Verhalten zusammengefasst werden sollten read
.
Antwort2
Versuchen Sie es mit etwas awk:
/usr/bin/awk -f
{
cmd=$1;
gsub($1 " +", "")
printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0)
}
Diese Ausgabe akzeptiert eine awk-Variable als Namen fürcmd2.
Sie können es folgendermaßen testen:
$ 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"