Получите часть строки до последней косой черты

Я пытаюсь написать сценарий conky, который показывает мое обложку альбома MPD, «folder.jpg» в папке альбома. Мой текущий план заключается в использовании mpc -f %file% , который печатает имя файла и путь, а затем вырезает фактическое имя файла (т.е. все после последнего /) и использует его как путь к объекту изображения conky ,

У меня проблемы с grep / cut, особенно потому, что некоторые песни вложены в две папки, а другие – в одном. ( grep -m 1 . |cut -f1 -d / работает для одиночных альбомов папок)

Как я могу это сделать? Есть ли более простой способ, которым я не хватает?

3 Solutions collect form web for “Получите часть строки до последней косой черты”

Вы можете использовать sed для удаления остальных – все, начиная с последней косой черты :

mpc -f %file% | head -1 | sed 's:/[^/]*$::'

Шаблон /[^/]*$ соответствует косой чертой, за которой следуют любые символы, кроме косой черты, вплоть до конца строки. Он заменяется пустой строкой.
head -1 игнорирует некоторый статус вывода по той строке, которую мы хотим, но смотрим ниже, как не вызывать их в первую очередь.

Если вы не используете sed, команда может выглядеть необычно из-за : used. Возможно, вы видели команды sed с / качестве разделителя раньше, например 's/foo/bar/' – я предпочитаю использовать разделитель : для удобочитаемости, поскольку выражение содержит / . В качестве альтернативы мы могли бы избежать выражения / в выражении: 's/\/[^\/]*$//' – это не делает его более читаемым.


То, как вы используете его с mpc дает вам две дополнительные строки статуса. Опция -q для тишины отключает весь выход. Вам необходимо объединить -q с явной печатью текущего файла воспроизведения, чтобы получить нужную строку, и ничего более:

mpc -q -f %file% current | sed 's:/[^/]*$::'

Вместо того, чтобы удалять все, начиная с последней косой черты , можно было явно напечатать все до последней косой черты :

mpc -q -f %file% current | sed 's:^\(.*\)/.*$:\1:'

Это соответствует любым символам, за которыми следуют символ / и любые другие символы; Он соответствует максимально возможному, так что совпадающий / будет последним.

Если вы хотите применить это правило к одной строке, то вместо sed (см. Другой ответ) вы можете использовать команду dirname :

 $ dirname "1 2/3 4/5 6/file" 1 2/3 4/5 6 

Греп не последний инструмент для работы. grep -m 1 . печатает первую непустую строку, что не полезно. Вы можете создавать сложные решения, которые включают grep и другие инструменты, но простой способ – с sed . Один из способов – заменить окончательный прогон без косой черты, плюс предыдущий косой чертой, пустой строкой:

 mpc -f %file% | sed 's:/[^/]*$::' 

В качестве альтернативы, сохраните все до последней косой черты и отбросьте следующее:

 mpc -f %file% | sed 's:^\(.*\)\(/.*\)$:\1:' 

Помните, что оба метода оставляют вход неизменным, если он не содержит / , т.е. если вы передаете имя файла без указания каталога. Хотя вы можете решить эту проблему в sed, если это проблема, проще вызвать команду dirname :

 dirname -- "$(mpc -f %file%)" 

В сценарии оболочки вы также можете использовать конструкторы расширения параметров , но это сложнее, если вы просто хотите распечатать результат:

 full_path="$(mpc -f %file%)" case "$full_path" in */*) directory_part="${full_path%/*}" *) directory_part="." printf '%s\n' "$directory_part" 
  • сложная настройка mpd / ssh?
  • Получите музыку от дозвукового, чтобы работать в безголовом MPD
  • mpd: нет аудиовыхода с PulseAudio, без смешивания с ALSA
  • Воспроизведение и управление несколькими аудиопотоками
  • mpd не может открыть устройство ALSA, где преуспевает aplay
  • Поток аудио системы через mpd
  • Установка mpd 0.17 или 0.16 на debian squeeze
  • MPD и Chrome не могут одновременно воспроизводить аудио
  • Ubuntu 15.10 - Невозможно отключить демон с помощью Systemd
  • Остановить Kodi от запуска экземпляра Pulseaudio
  • Не удалось привязать к '127.0.0.1:6600': адрес уже используется
  • Interesting Posts

    Как проверить, не работает ли USB WiFi-адаптер, или маршрутизатор выходит за пределы допустимого диапазона?

    Всегда перенаправлять ошибку в / dev / null

    GNU Параллельно обрабатывает несколько файлов параллельно в Unix с bash

    Почему не найдено сопоставление файлов, если перед ними стоит звездочка (*)?

    Сценарий, чтобы взять pid, дать имя cmd, сетевые подключения, дерево процессов, родительский / дедушка / ребенок

    Счетчики ошибок iostat в Solaris

    Найдите процесс, который потребляет память

    Linux не обнаружен grub

    Удалить заголовок в результатах журнала

    Как найти URL-адреса пакетов с помощью Yum?

    Линукс командной строки может подключаться, но веб-сервер (или php) не может подключиться

    Сумма альтернативных значений в столбце с использованием команды sed или nawk

    KDE; каждый монитор другого рабочего стола

    Установите диски ATA в каталог с именем UUID

    Объем переменных при вызове функции из find

    Linux и Unix - лучшая ОС в мире.