macOS 10.14.6
zsh 5.8
jq 1.6
Ich habe eine Situation, in der ich eine Reihe von .vital
Dateien habe, bei denen es sich um getarnte JSON-Dateien handelt. Ich möchte aus jeder Datei eine Information extrahieren, und ich habe herausgefunden, dass brew install jq
ich nach der Installation von jq mit ausführen kann, zum Beispiel ...
jq '.author' Analog_Bass__Lead.vital;
Das gibt mir...
"maniclout"
welches der richtige Autor für diesen Artikel ist.
Was ich tun möchte, ist, diesen Befehl über alle meine .vital
Dateien, etwa 30 davon, in einer for
Schleife auszuführen.
Ich kann die Dateien in Ordnung auflisten mit ...
for f in $(ls *.vital);
do
echo $f
done;
Das Problem tritt auf, wenn ich versuche, eine Schleife zu konstruieren, die Folgendes ergeben würde ...
Analog_Bass__Lead.vital "maniclout"
Blackhole_Dimension.vital "Cobranix"
usw...
Das ist mein neuster Versuch (bitte nicht lachen!)...
for f in $(ls *.vital);
do
echo $f;
echo -n $f | jq ‘.author’
done;
Wie Sie sehen können, versuche ich, den Dateinamen gefolgt von in derselben Zeile auszugeben, daher das -n
, und ich versuche, den Dateinamen in den jq
Befehl einzufügen.
Die Ergebnisse sind ziemlich katastrophal!
ANALOG_PAD_-_6.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error
Analog_Bass__Lead.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error
Atomosphere_Lead.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error
Kann jemand sehen, was ich falsch mache?
Analysieren/interpretieren Sie die Ausgabe vonls
nicht , zu viele Dinge können schief gehen. Ein einfacher Weg, um Ihr Ziel zu erreichen, wäre
for f in *.vital; do
echo -n "$f: "
jq '.author' "$f"
done
was zum Beispiel immer noch fehlschlagen kann, wenn es Verzeichnisse gibt, die mit dem Muster übereinstimmen. Sie können dies überwinden, indem Sie verwenden
for f in *.vital; do
[[ -f "$f" ]] || continue
echo -n "$f: "
jq '.author' "$f"
done
Sie können auch den vollen Weg gehen und laufen
find . -maxdepth 1 -type f -name '*.vital' \
-exec sh -c 'echo -n "$1"; jq ".author" "$1"' _ {} \;
( Informationen zur Funktionsweise finden Sie unter http://mywiki.wooledge.org/UsingFind#Complex_actions )
Sie könnten find verwenden, um eine Liste von .vital
Dateien zu erhalten, und diese dann an Folgendes weiterleiten jq
:
find *.vital | xargs jq '.author'
kein Hang