Đầu tiên, tôi nên nói rằng cách dễ nhất để làm điều này là sử dụng các lệnh đặt tên trước hoặc đổi tên.
Trên Ubuntu, OSX (gói Homebrew rename
, gói MacPorts p5-file-rename
) hoặc các hệ thống khác có đổi tên perl (prename):
rename s/0000/000/ F0000*
hoặc trên các hệ thống đổi tên từ using-linux-ng, chẳng hạn như RHEL:
rename 0000 000 F0000*
Điều đó dễ hiểu hơn nhiều so với lệnh sed tương đương.
Nhưng để hiểu lệnh sed, trang sed rất hữu ích. Nếu bạn chạy man sed và tìm kiếm & (sử dụng lệnh / để tìm kiếm), bạn sẽ thấy đó là một ký tự đặc biệt trong s / foo / bar / thay thế.
s/regexp/replacement/
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
Do đó, \(.\)
khớp với ký tự đầu tiên, có thể được tham chiếu bởi \1
. Sau đó, .
khớp với ký tự tiếp theo, luôn là 0. Sau đó \(.*\)
khớp với phần còn lại của tên tệp, có thể được tham chiếu bởi \2
.
Chuỗi thay thế đặt tất cả lại với nhau bằng cách sử dụng &
(tên tệp gốc) và \1\2
là mọi phần của tên tệp ngoại trừ ký tự thứ 2, là số 0.
Đây là một cách khá khó hiểu để làm điều này, IMHO. Nếu vì lý do nào đó mà lệnh đổi tên không khả dụng và bạn muốn sử dụng sed để đổi tên (hoặc có lẽ bạn đang làm điều gì đó quá phức tạp cho việc đổi tên?), Thì regex của bạn rõ ràng hơn sẽ làm cho nó dễ đọc hơn nhiều. Có lẽ một cái gì đó như:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Có thể thấy những gì thực sự thay đổi trong s / tìm kiếm / thay thế / làm cho nó dễ đọc hơn nhiều. Ngoài ra, nó sẽ không tiếp tục hút các ký tự ra khỏi tên tệp của bạn nếu bạn vô tình chạy nó hai lần hoặc một cái gì đó.