Extrahieren einer bestimmten Textzeile mit grep für die Verwendung in conky

1107
dgz

Ich versuche, das Verzeichnis des aktuell wiedergegebenen Songs in Quodlibet zu extrahieren, um zu versuchen, das Album-Artwork in Conky anzuzeigen.

In der aktuellen Datei von QL ~/.quodlibet/currentgibt es eine Zeile, die den vollständigen Pfad des gerade gespielten Songs angibt. Ich brauche nur das Verzeichnis. Gibt es eine Möglichkeit, den letzten Teil des Pfads mit grep zu ignorieren?

Wenn ich zum Beispiel eine Datei aufgerufen hätte /music/album/03-song.ogg, würde ich nur wollen, dass grep alles vor den Alben 0(oder 1/2/3/4für längere Alben) ausgibt .

Ich habe keine Ahnung, ob ich das nutzen kann, wofür ich es brauche, aber es wäre trotzdem nützlich, dies als Referenz zu wissen.

0

4 Antworten auf die Frage

2
slhck

Wenn die currentDatei einen gültigen Pfad zu einer Datei enthält, rufen Sie einfach den Verzeichnisnamen ab:

dirname $(< ~/.quodlibet/current) 

Der $(< …)liest eine Datei und ersetzt deren Inhalt, als wäre sie escat .

Sie möchten die Datei nicht wirklich analysieren oder reguläre Ausdrücke verwenden. Dies ist wahrscheinlich ein Fehler, wenn der Verzeichnisname beispielsweise eine "0" enthält. Die einzige verlässliche Informationsquelle zur Ermittlung des Verzeichnisses ist der letzte Schrägstrich dirname.

Dies ist eine elegantere Lösung, aber reguläre Ausdrücke können zwar leicht brechen (sie sind nicht zu benutzerfreundlich), aber Sie können Verzeichnisse effektiv mit ihnen analysieren. Ben Richards vor 11 Jahren 0
0
Ben Richards

Sie können dies tun, indem Sie Ihre grepAusgabe an sedreguläre Ausdrücke weiterleiten und die gewünschten Informationen extrahieren.

Sie können die sedSyntax für reguläre Ausdrücke und die dazugehörige Syntax von deren Handbuchseite lesen .

Ich würde gerne wissen, was mit dieser Antwort falsch ist, von wem auch immer die Stimme abgelehnt hat. Ben Richards vor 11 Jahren 0
Ich war es nicht, der dich abgestumpft hat, aber wenn du sowieso sed verwenden willst, warum dann überhaupt mit einem grep? Ich würde sagen, es war unnötige Anstrengung. tink vor 11 Jahren 0
@tink Wenn Sie es in mehreren Schritten einsetzen, werden die regulären Ausdrücke, die Sie schreiben müssen, einfacher, da Sie das Problem in einfachere Teile zerlegen. Sie können es mit einem einzigen Regex umschreiben, aber das kann leicht dazu führen, dass es unhandlich wird. Ich habe beides gemacht, und ich bevorzuge Pfeifen. Ben Richards vor 11 Jahren 0
Sie können es in mehreren Schritten schreiben, ohne "grep" zu involvieren. `grep 'was auch immer' ~ / .quodlibet / current | sed "whatever2" ist äquivalent zu "sed" / what /! d; whatever2 "~ / .quodlibet / current". Sie können eine beliebige Anzahl von Ausdrücken in "sed" einfädeln. Dies entspricht ästhetisch dem Paspeln, ist jedoch (je nachdem, was Sie tun) effizienter. kine vor 11 Jahren 0
@kine Guter Punkt, für viele Aufgaben wäre dies jedoch ein vernachlässigbarer Effizienzunterschied. Ben Richards vor 11 Jahren 0
0
tink

Nur weil ich sed mag ... :) Liebe @ slhcks geniale Lösung!

$ echo /music/album/03-song.ogg| sed -r 's@^(.+)/.+$@\1@' /music/album 
0
lazka
quodlibet --print-playing "<~dirname>"