Hier gibt es einige gute Antworten, aber ich sehe nur eine, die den ValTeil des Problems enthält, und es ist nicht eindeutig, ob dies richtig ist. Ich bin damit einverstanden, dass dies awk„ein erstaunliches Werkzeug“ ist, aber hier ist es nicht notwendig. Ich glaube, dass dieser sedBefehl:
sed -n '/\[part1\]/,/\[part2\]/s/.*Val.*=//p' "$file"
wahrscheinlich macht was gewünscht. Wie die anderen sed -e '/\[part1\]/,/\[part2\]/p'Lösungen ( Networker
und Babyy ) ist dies trivial anpassbar, um einen beliebigen Abschnitt auszuwählen. (Sie müssen natürlich den Namen kennen. Wenn Sie nur die Ordnungszahl kennen, können Sie die Antwort von terdon
oder die Antwort von glenn jackman anpassen. Beide zählen Abschnitte, anstatt nach einem bestimmten Namen zu suchen.) Wenn Sie dies nicht tun Kennen Sie den Namen des folgenden Abschnitts, können Sie tun
sed -n '/ \ [part42 \] /, / \ [part / s…' "$ file"
zum Beispiel.
Meine einzige Meta-Frage betrifft den cut -d'=' -f2Teil der Frage. Wenn eine Eingabezeile, aus der wir Daten extrahieren, mehrere =Zeichen nach enthält Val(dh der Feldwert enthält =Zeichen), z.
Einstein.Val = E=mc^2
dann cutextrahiert der obige Befehl nur den Text zwischen dem ersten und dem zweiten =
(dh dem Feldwert bis zum ersten (aber nicht einschließlich) dem ersten =), z E. Der sedBefehl, den ich oben dargestellt habe, extrahiert nur den Text nach dem letzten = (z mc^2. B. ). Verwenden Sie, um alles nach dem ersten =(z. B. E=mc^2) zu erhalten
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=//p' "$file"
Verwenden Sie, um das Verhalten von cut(z. B. E) nachzuahmen
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=\([^=]*\).*/\1/p' "$file"
Beachten Sie, dass mein Ansatz davon ausgeht, dass die Daten zumindest allgemein der Abbildung in der Frage entsprechen. dh mindestens eine =erscheint irgendwo rechts von der ValZeichenfolge. Dementsprechend werden alle meine Lösungen Eingaben wie ignorieren
Girl.Name = Valerie
Valerie Bertinelli
auch wenn es zwischen [part1]und fällt [part2].
cat file | grep foosinnlos ist. Es ist bekannt als "nutzlose Verwendung von Katze" . Sie könnengrep foo filestattdessen immer tun .