Wydobywanie określonej linii tekstu za pomocą grep do użycia w conky

0

Próbuję wyodrębnić katalog aktualnie odtwarzanego utworu w Quodlibet, aby użyć go do wyświetlenia okładki albumu w conky.

W bieżącym pliku QL ~/.quodlibet/currentznajduje się wiersz, który podaje pełną ścieżkę aktualnie odtwarzanego utworu, ale potrzebuję tylko katalogu. Czy istnieje sposób, w jaki mogę zignorować ostatnią część ścieżki za pomocą grep?

Na przykład, gdybym miał plik o nazwie /music/album/03-song.ogg, chciałbym, aby grep wyświetlał wszystko przed 0(lub w 1/2/3/4przypadku dłuższych albumów).

Nie mam pojęcia, czy mogę użyć tego do tego, czego potrzebuję, ale nadal warto wiedzieć na przyszłość.

dgz
źródło

Odpowiedzi:

2

Jeśli currentplik zawiera prawidłową ścieżkę do pliku, po prostu uzyskaj jego nazwę katalogu:

dirname $(< ~/.quodlibet/current)

$(< …)Odczyta plik i zastąpić jego zawartość tak, jakby to byłocat .

Tak naprawdę nie chcesz analizować pliku ani używać żadnych wyrażeń regularnych. Może się to zepsuć, jeśli na przykład nazwa katalogu zawiera „0”. Jedynym wiarygodnym źródłem informacji do określenia katalogu jest ostatni ukośnik, który i dirnametak obsługuje.

slhck
źródło
Jest to bardziej eleganckie rozwiązanie, ale chociaż wyrażenia regularne mogą łatwo ulec uszkodzeniu (nie są zbyt przyjazne dla użytkownika), możesz skutecznie analizować z nimi katalogi.
Ben Richards,
0

Możesz to zrobić, grepprzesyłając dane wyjściowe sedi używając wyrażeń regularnych w celu wyodrębnienia żądanych informacji.

Możesz przeczytać sedi jego składnię wyrażeń regularnych ze strony podręcznika.

Ben Richards
źródło
Chciałbym wiedzieć, co jest nie tak z tą odpowiedzią od każdego, kto ją zagłosował.
Ben Richards,
To nie ja cię oceniłem, ale jeśli mimo wszystko zamierzasz użyć sed, po co zawracać sobie głowę grepem? Powiedziałbym, że to był niepotrzebny wysiłek.
zadzwonić
@tink Umieszczenie go w kilku etapach sprawia, że ​​wyrażenia regularne, które musisz pisać, są prostsze, ponieważ dzielisz problem na prostsze części. Państwo może przepisać go z pojedynczym regex, ale to można łatwo zrobić to bardzo niewygodne. Zrobiłem oba i wolę orurowanie.
Ben Richards,
Możesz napisać go w kilku etapach bez angażowania grep. grep 'whatever' ~/.quodlibet/current | sed 'whatever2'jest równoważne z sed '/whatever/!d; whatever2' ~/.quodlibet/current. Możesz wpisać dowolną liczbę wyrażeń wewnątrz sedi będzie to estetycznie równoważne z potokowaniem, ale (w zależności od tego, co robisz) bardziej wydajne.
kine
@kine Dobra uwaga, choć w przypadku wielu zadań byłaby to nieistotna różnica w wydajności.
Ben Richards,
0

Tylko dlatego, że lubię sed :) ... genialne rozwiązanie love @ slhck!

$ echo /music/album/03-song.ogg| sed -r 's@^(.+)/.+$@\1@'
/music/album
zadzwonić
źródło
0
quodlibet --print-playing "<~dirname>"
Lazka
źródło