Intereting Posts
Определите тип интерфейса / режим мониторинга с помощью «/ sys / class / net» Проблема разрешения Crontab Добавление нового каталога в PATH и символическую ссылку для каталога уже в PATH Можно ли использовать один SSH-ключ для каждой учетной записи для каждой учетной записи на данном удаленном сервере? Ядерная паника после перехода от хриплых к jessie Установка Zend на Fedora 19 Как найти блокировку для коммутации виртуальных терминалов? Почему «systemctl start» запрашивает пароль для шифрования диска? перемещение свободного пространства перед другим разделом (для изменения размера корневой части). Проблема установки CentOS 6.4 (вторая) после этого Win7 (First) – двойная загрузка передать ответ на команду git Как остановить многие процессы, такие как единорог и sidekiq, используя единую команду в определенной среде Как написать программу запуска приложений, которая запустит Atom в пользовательском рабочем каталоге? Копирование файлов с моего (оконного) компьютера в удаленную систему по ssh Копировать файл во все подкаталоги, содержащие файл с определенным именем

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

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

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

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

Вы можете использовать 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"