sed -n 's/^potato:[[:space:]]*//p' file.txt
Man kann sich Grep als eingeschränktes Sed oder Sed als verallgemeinertes Grep vorstellen. In diesem Fall ist Sed ein gutes, leichtgewichtiges Werkzeug, das tut, was Sie wollen – obwohl es natürlich auch mehrere andere vernünftige Möglichkeiten gibt, dies zu tun.
grep -Po 'potato:\s\K.*' file
-P
um einen regulären Perl-Ausdruck zu verwenden
-o
um nur die Übereinstimmung auszugeben
\s
um mit dem Leerzeichen nach potato:
übereinzustimmen
\K
um die Übereinstimmung wegzulassen
.*
um den Rest der Zeichenfolge(n) abzugleichen
Oder verwenden Sie Regex-Zusicherungen:grep -oP '(?<=potato: ).*' file.txt
grep 'potato:' file.txt | sed 's/^.*: //'
grep
sucht nach einer Zeile, die den String potato:
enthält , dann für jede dieser Zeilen sed
ersetzt (s///
- Ersatz) ein beliebiges Zeichen (.*
) vom Anfang der Zeile (^
) bis zum letzten Auftreten der Sequenz :
(Doppelpunkt gefolgt von Leerzeichen) durch die leere Zeichenfolge (s/...//
- Ersetzen Sie den ersten Teil durch den zweiten Teil, der leer ist).
oder
grep 'potato:' file.txt | cut -d\ -f2
Für jede Zeile, die potato:
enthält , cut
teilt die Zeile in mehrere Felder auf, die durch Leerzeichen getrennt sind (-d\
- d
=Trennzeichen, \
=maskiertes Leerzeichen, so etwas wie -d" "
hätte auch funktioniert) und das zweite Feld jeder solchen Zeile ausgeben (-f2
).
oder
grep 'potato:' file.txt | awk '{print $2}'
Für jede Zeile, die potato:
enthält , awk
druckt das zweite Feld (print $2
), die standardmäßig durch Leerzeichen getrennt ist.
oder
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
Alle Zeilen, die potato:
enthalten werden an eine Inline gesendet (-e
) Perl-Skript, das alle Zeilen von stdin
übernimmt , führt dann für jede dieser Zeilen dieselbe Ersetzung wie im ersten obigen Beispiel durch und gibt sie dann aus.
oder
awk '{if(/potato:/) print $2}' < file.txt
Die Datei wird per stdin
gesendet (< file.txt
sendet den Inhalt der Datei über stdin
zum Befehl auf der linken Seite) zu einem awk
Skript, das für jede Zeile, die potato:
enthält (if(/potato:/)
gibt true zurück, wenn der reguläre Ausdruck /potato:/
entspricht der aktuellen Zeile), druckt das zweite Feld, wie oben beschrieben.
oder
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
Die Datei wird per stdin
gesendet (< file.txt
, siehe oben) zu einem Perl-Skript, das ähnlich wie das obige funktioniert, diesmal aber auch dafür sorgt, dass jede Zeile den String potato:
enthält (/potato:/
ist ein regulärer Ausdruck, der passt, wenn die aktuelle Zeile potato:
enthält , und falls ja (&&
), wendet dann den oben beschriebenen regulären Ausdruck an und gibt das Ergebnis aus).