Извлечение определенной строки текста с помощью grep для использования в conky

976
dgz

Я пытаюсь извлечь каталог текущей воспроизводимой песни в Quodlibet для использования при попытке отобразить обложку альбома в conky.

В текущем файле QL ~/.quodlibet/currentесть строка, которая дает вам полный путь к текущей воспроизводимой песне, но мне нужен только каталог. Есть ли способ, которым я могу игнорировать последнюю часть пути с помощью grep?

Например, если бы у меня был файл с именем /music/album/03-song.ogg, я бы хотел, чтобы grep выводил все до 0(или 1/2/3/4для более длинных альбомов).

Я понятия не имею, могу ли я использовать это для того, для чего мне это нужно, но все равно было бы полезно узнать это для дальнейшего использования.

0

4 ответа на вопрос

2
slhck

Если currentфайл содержит допустимый путь к файлу, просто получите его имя каталога:

dirname $(< ~/.quodlibet/current) 

$(< …)Будет читать файл и заменить его содержимое, как если бы оно былоcat .

Вы на самом деле не хотите анализировать файл или использовать какие-либо регулярные выражения. Это может сломаться, например, если имя каталога содержит «0». Единственный надежный источник информации для определения каталога - это последний слеш, dirnameкоторый в любом случае обрабатывает это.

Это более элегантное решение, но хотя регулярные выражения могут легко ломаться (они не слишком удобны для пользователя), с ними можно эффективно анализировать каталоги. Ben Richards 10 лет назад 0
0
Ben Richards

Вы можете сделать это, отправив grepвыходные данные sedи используя регулярные выражения для извлечения нужной информации.

Вы можете прочитать о sedего синтаксисе регулярных выражений на его странице руководства.

Я хотел бы знать, что не так с этим ответом от того, кто бы за него не проголосовал. Ben Richards 10 лет назад 0
Это был не я, кто тебя отверг, но если ты все равно собираешься использовать sed, зачем вообще возиться с grep? Я бы сказал, что это было ненужное усилие. tink 10 лет назад 0
@tink Если поместить его в несколько этапов, регулярные выражения, которые вам придется писать, проще, потому что вы разбиваете проблему на более простые части. Вы * можете * переписать его одним регулярным выражением, но это может сделать его очень громоздким. Я сделал оба, и я предпочитаю трубопровод. Ben Richards 10 лет назад 0
Вы можете написать это в несколько этапов без участия `grep`. `grep 'что угодно' ~ / .quodlibet / current | sed 'what2'` эквивалентно `sed' / what / / d; what2 '~ / .quodlibet / current`. Вы можете связать любое количество выражений внутри `sed`, и это будет эстетически эквивалентно конвейеру, но (в зависимости от того, что вы делаете) более эффективно. kine 10 лет назад 0
@kine Хороший вопрос, хотя для многих задач это будет незначительная разница в эффективности. Ben Richards 10 лет назад 0
0
tink

Только потому, что мне нравится sed :) ... блестящее решение love @ slhck!

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

Похожие вопросы