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

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

свяжите md5 (1) И md5 (2) И md5 (3) в заключительный файл-> md5 (final_file)

7
03.09.2014, 02:36
3 ответа

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

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

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

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


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

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

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

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

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

9
27.01.2020, 20:15

Grep не является последним инструментом для задания. 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"
2
27.01.2020, 20:15

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

$ dirname "1 2/3 4/5 6/file"
1 2/3 4/5 6
3
27.01.2020, 20:15

Теги

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