В дополнение к ответу Кента, альтернативное решение awk:
awk 'BEGIN{FS=OFS="/"}{NF--}1'
, у которого то же заболевание, что и у Кента.Следующее, несколько длиннее, Awk исправляет все недостатки:
awk 'BEGIN{FS=OFS="/"}{gsub("/+","/")}
{s=$0~/^\//;NF-=$NF?1:2;$0=$0?$0:(s?"/":".")};1' <file>
Следующая таблица показывает разницу:
| path | dirname | awk full | awk short |
|------------+---------+----------+-----------|
| . | . | . | |
| / | / | / | |
| foo | . | . | |
| foo/ | . | . | foo |
| foo/bar | foo | foo | foo |
| foo/bar/ | foo | foo | foo/bar |
| /foo | / | / | |
| /foo/ | / | / | /foo |
| /foo/bar | /foo | /foo | /foo |
| /foo/bar/ | /foo | /foo | /foo/bar |
| /foo///bar | /foo | /foo | /foo// |
примечание: dirname
- реальноепуть, если вам не нужно обрабатывать их массы, хранящиеся в файле.