Übergeben mehrerer Argumente durch eine Pipe

Übergeben mehrerer Argumente durch eine Pipe

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 wordan 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 cmd2ist 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

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

verwandte Informationen