Chỉ gán một phần của chuỗi cho một biến trong bash


11

Tôi nhận được từ người dùng một filepath tuyệt đối nhất định và tôi muốn tạo một biến sẽ là một chuỗi không bao gồm chỉ hai thành phần ĐẦU TIÊN của đường dẫn tệp, nhưng không in nó hoặc bất cứ thứ gì.

Ví dụ: đường dẫn tuyệt đối có thể là:

/home/myusername/folder1/folder2/folder3

Và nó được lưu trong "target_path" và tôi muốn "mydir" chỉ là:

/folder1/folder2/folder3

Tôi đã thử sử dụng lệnh cắt theo nhiều cách khác nhau nhưng không thành công.


Là thư mục /home/usernamethực tế $HOMEcủa người dùng gọi? nếu vậy bạn có thể loại bỏ nó đơn giản bằng cách sử dụng mydir="${target_path#$HOME}"tôi nghĩ
Steeldo

Câu trả lời:


15

Sử dụng thao tác chuỗi của bash :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Vì vậy, chuỗi bạn muốn sẽ là (thêm lại dấu gạch chéo hàng đầu):

b="/${a#/*/*/}"

Đối với một biến a, ${a#foo}sẽ loại bỏ các khớp chuỗi ngắn nhất footừ sự khởi đầu của a. Vì vậy, chúng tôi loại bỏ chuỗi ngắn nhất chứa ba /(bao gồm dấu gạch chéo hàng đầu trong đường dẫn), để loại bỏ hai thành phần đầu tiên của đường dẫn tuyệt đối.


Đường dẫn có thể là 30 thư mục và tôi chỉ muốn bao gồm 28 thư mục cuối cùng. Điều này có còn hoạt động không?
Cuộc sống của pi

@Lifeofpi tại sao không?
muru

9

Dưới đây là một ví dụ sử dụng cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

Nếu bạn cần dẫn đầu, /bạn có thể nối | sed 's/^/\//'vào cuối dòng của bạn.

Bạn cần -f4-bởi vì -d '/'nói cutđể sử dụng /như một dấu phân cách giữa các trường. Vì vậy, trường đầu tiên xuất hiện trước dấu phân cách đầu tiên, trong trường hợp này trường đầu tiên trống. Vì vậy, folder1là lĩnh vực thứ 4 và -f4-nói cắt sử dụng tất cả các lĩnh vực từ thứ 4 trở đi.


7

Bạn có thể sử dụng mở rộng tham số bash như vậy:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

Sau đây:

echo $myvar

cho:

/folder1/folder2/folder3

Nó hoạt động bằng cách loại bỏ kết quả khớp đầu tiên của mẫu /*/*/khỏi biến target_path của bạn, bằng cách sử dụng ${target_path#pattern}cú pháp mở rộng tham số shell. Thật không may, điều này loại bỏ /ký tự đầu tiên , đó là lý do tại sao ký tự đó phải được bao gồm rõ ràng trong khi đặt biến myvar.

Cảnh báo: Bạn nên kiểm tra xem biến target_path của bạn có chứa một số ký tự và dài hơn hai đoạn đường dẫn trước khi sử dụng phương thức này. Ví dụ nếu target_path=/home/username/, sau đó myvar=/. Điều này có thể nguy hiểm cho hệ thống của bạn nếu bạn đang chạy một cái gì đó như rm -rf "$myvar"*. Đừng thử điều này!


Đường dẫn có thể là 30 thư mục và tôi chỉ muốn bao gồm 28 thư mục cuối cùng. Điều này có còn hoạt động không?
Cuộc sống của pi

Chắc chắn, điều này sẽ chỉ cắt hai cái đầu tiên, bất kể con đường dài bao nhiêu.
Arronical 10/11/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.