Làm cách nào để loại bỏ các dấu gạch chéo không cần thiết trong một đường dẫn nhất định?Xóa các dấu gạch chéo không cần thiết khỏi đường dẫn đã cho bằng bash
Ví dụ:
p="/foo//////bar///hello/////world"
Tôi muốn:
p="/foo/bar/hello/world"
Làm cách nào để loại bỏ các dấu gạch chéo không cần thiết trong một đường dẫn nhất định?Xóa các dấu gạch chéo không cần thiết khỏi đường dẫn đã cho bằng bash
Ví dụ:
p="/foo//////bar///hello/////world"
Tôi muốn:
p="/foo/bar/hello/world"
/foo/.//bar///hello/./world
chỉ hoạt động tốt.readlink -f
, nhưng điều này cũng sẽ hợp chuẩn hóa các liên kết tượng trưng trong đường dẫn đó, do đó kết quả phụ thuộc vào hệ thống tệp của bạn và đường dẫn được cung cấp phải tồn tại ...., vì vậy đây sẽ không làm việc cho đường dẫn ảohầu hết thời gian, dấu gạch chéo thêm làm việc tốt, nhưng trong một số trường hợp chúng gây ra vấn đề (tôi đã từng có điều này với một tùy chọn rsync không hoạt động chính xác nếu đường dẫn đã tăng gấp đôi dấu gạch chéo) – steabert
Cảm ơn replys tôi biết con đường hoạt động tốt tôi chỉ muốn điều này vì những lý do quang
tôi tìm thấy một giải pháp: echo $p | replace '//' ''
Sử dụng tinh khiết Bash:
shopt -s extglob
echo ${p//\/*(\/)/\/}
này hoạt động với nhiều dải phân cách và không giả định con đường cho nên tồn tại:
p=/foo///.//bar///foo1/bar1//foo2/./bar2;
echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//"))
gsub("//","/"); print $1;}'
Nhưng không đơn giản hóa cũng chứa chuỗi ".."
Với realpath:
realpath -sm $p
Tham số:
-m, --canonicalize-missing no components of the path need exist
-s, --strip, --no-symlinks don't expand symlinks
đầu vào của bạn:
p="/foo//////bar///hello/////world"
lệnh để loại bỏ các dấu gạch chéo không liên quan:
echo $p | tr -s/
đầu ra:
/foo/bar/hello/world
thể sử dụng 'readlink -m' thay vào đó, và thư mục không cần phải tồn tại. –
@Ryan Li Cảm ơn, đó thực sự là cách tốt hơn. Đã cập nhật. – phihag
Cảm ơn. Tôi đã thử 'sed 's/\/\ // \ // g'' mà doesnt làm việc theo cách tôi muốn. – casper