Mã này với awk sẽ làm việc một cách hoàn hảo như giống như dirname, tôi đoán.
Rất đơn giản và có chi phí rất thấp để hoạt động. Chúc may mắn.
Mã
$ foo=/app/java/jdk1.7.0_71/bin/java
$ echo "$foo" | awk -F "/?[^/]*/?$" '
{ print ($1 == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : $1); }'
quả
/app/java/jdk1.7.0_71/bin
thử nghiệm
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/
->.
More
Nếu bạn không có sẵn awk delimiter như vậy, hãy thử theo cách này.
$ echo $foo | awk '{
dirname = gensub("/?[^/]*/?$", "", "", $0);
print (dirname == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : dirname);
}'
Nguồn
2017-03-28 02:49:38
Ngữ cảnh là gì? Có phải là trong một tập tin? Bạn có nhiều hơn một lần xuất hiện không? Bạn có ...? – fge
sed và awk là overkill cho điều này, vỏ có tiện ích này trực tiếp. – Mat
nếu bạn đang sử dụng bash: tại sao không sử dụng lệnh 'dirname'? – codeling