Questo codice con awk funziona perfettamente come stessi dirname, immagino.
È così semplice e ha un costo molto basso per funzionare. In bocca al lupo.
Codice
$ foo=/app/java/jdk1.7.0_71/bin/java
$ echo "$foo" | awk -F "/?[^/]*/?$" '
{ print ($1 == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : $1); }'
Risultato
/app/java/jdk1.7.0_71/bin
prova
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/
->.
Più
Se non si è disponibili ad delimitatore awk, provare in questo modo.
$ echo $foo | awk '{
dirname = gensub("/?[^/]*/?$", "", "", $0);
print (dirname == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : dirname);
}'
fonte
2017-03-28 02:49:38
Qual è il contesto? È in un file? Hai più di un evento? Fai... ? – fge
sed e awk sono overkill per questo, le shell hanno utility per questo direttamente. – Mat
se stai usando bash: perché non usare il comando 'dirname'? – codeling