Pertama, saya harus mengatakan bahwa cara termudah untuk melakukan ini adalah dengan menggunakan perintah prename atau ganti nama.
Di Ubuntu, OSX (paket Homebrew rename
, paket MacPorts p5-file-rename
), atau sistem lain dengan perl rename (nama awal):
rename s/0000/000/ F0000*
atau pada sistem dengan ganti nama dari util-linux-ng, seperti RHEL:
rename 0000 000 F0000*
Itu jauh lebih bisa dimengerti daripada perintah sed yang setara.
Tetapi untuk memahami perintah sed, halaman manual sed sangat membantu. Jika Anda menjalankan man sed dan mencari & (menggunakan / perintah untuk mencari), Anda akan menemukan itu adalah karakter khusus di s / foo / bar / replacements.
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.
Oleh karena itu, \(.\)
cocokkan karakter pertama, yang dapat dirujuk oleh \1
. Kemudian .
cocok dengan karakter berikutnya, yang selalu 0. Kemudian \(.*\)
cocok dengan sisa nama file, yang dapat direferensikan oleh \2
.
String pengganti menyatukan semuanya menggunakan &
(nama file asli) dan \1\2
yang merupakan setiap bagian dari nama file kecuali karakter ke-2, yang merupakan 0.
Ini adalah cara yang cukup samar untuk melakukan ini, IMHO. Jika karena alasan tertentu perintah ganti nama tidak tersedia dan Anda ingin menggunakan sed untuk mengganti nama (atau mungkin Anda melakukan sesuatu yang terlalu rumit untuk diganti nama?), Menjadi lebih eksplisit dalam regex Anda akan membuatnya lebih mudah dibaca. Mungkin sesuatu seperti:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Mampu melihat apa yang sebenarnya berubah di s / search / replacement / membuatnya lebih mudah dibaca. Juga tidak akan terus menyedot karakter dari nama file Anda jika Anda tidak sengaja menjalankannya dua kali atau sesuatu.