Ten kod z awk będzie działać idealnie tak samo jak dirname, tak myślę.
Jest to bardzo proste i ma bardzo niski koszt pracy. Powodzenia.
Kod
$ foo=/app/java/jdk1.7.0_71/bin/java
$ echo "$foo" | awk -F "/?[^/]*/?$" '
{ print ($1 == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : $1); }'
Wynik
/app/java/jdk1.7.0_71/bin
test
foo=/app/java/jdk1.7.0_71/bin/java
->/app/java/jdk1.7.0_71/bin
foo=/app/java/jdk1.7.0_71/bin/
->/app/java/jdk1.7.0_71
foo=/app/java/jdk1.7.0_71/bin
->/app/java/jdk1.7.0_71
foo=/app/
->/
foo=/app
->/
foo=fighters/
->.
Więcej
Jeśli nie jesteś dostępny takich awk separator, spróbuj go w ten sposób.
$ echo $foo | awk '{
dirname = gensub("/?[^/]*/?$", "", "", $0);
print (dirname == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : dirname);
}'
Jaki jest kontekst? Czy to w pliku? Czy masz więcej niż jedno zdarzenie? Czy ty... ? – fge
sed i awk są przesadzone, powłoki mają narzędzia do tego bezpośrednio. – Mat
jeśli używasz bash: dlaczego nie użyć polecenia 'dirname'? – codeling