ก่อนอื่นฉันควรบอกว่าวิธีที่ง่ายที่สุดในการทำเช่นนี้คือใช้คำสั่ง prename หรือเปลี่ยนชื่อ
บน Ubuntu, OSX (แพ็คเกจ Homebrew rename
, แพ็คเกจMacPorts p5-file-rename
) หรือระบบอื่น ๆ ที่มีการเปลี่ยนชื่อ Perl (ชื่อล่วงหน้า):
rename s/0000/000/ F0000*
หรือบนระบบที่เปลี่ยนชื่อจาก util-linux-ng เช่น RHEL:
rename 0000 000 F0000*
นั่นเป็นเรื่องที่เข้าใจได้มากกว่าคำสั่ง sed ที่เทียบเท่า
แต่สำหรับการทำความเข้าใจคำสั่ง sed manpage sed จะเป็นประโยชน์ หากคุณเรียกใช้ man sed และค้นหา & (โดยใช้คำสั่ง / เพื่อค้นหา) คุณจะพบว่าเป็นอักขระพิเศษใน 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.
ดังนั้นตรงกับตัวอักษรตัวแรกซึ่งสามารถอ้างอิงโดย\(.\)
\1
จากนั้น.
ตรงกับตัวอักษรถัดไปซึ่งเป็นเสมอ 0 จากนั้นตรงกับส่วนที่เหลือของชื่อไฟล์ซึ่งสามารถนำมาอ้างอิงโดย\(.*\)
\2
สตริงแทนที่รวมทั้งหมดเข้าด้วยกันโดยใช้&
(ชื่อไฟล์ต้นฉบับ) และ\1\2
เป็นทุกส่วนของชื่อไฟล์ยกเว้นอักขระตัวที่ 2 ซึ่งเป็น 0
นี่เป็นวิธีที่ค่อนข้างคลุมเครือในการทำ IMHO หากด้วยเหตุผลบางประการคำสั่งเปลี่ยนชื่อไม่พร้อมใช้งานและคุณต้องการใช้ sed เพื่อทำการเปลี่ยนชื่อ (หรือบางทีคุณกำลังทำบางสิ่งที่ซับซ้อนเกินไปสำหรับการเปลี่ยนชื่อ?) การมีความชัดเจนมากขึ้นใน regex ของคุณจะทำให้อ่านได้ง่ายขึ้น บางทีสิ่งที่ชอบ:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
ความสามารถในการดูว่ามีอะไรเปลี่ยนแปลงใน s / search / replacement / ทำให้อ่านได้ง่ายขึ้น นอกจากนี้มันจะไม่ดูดอักขระออกจากชื่อไฟล์ของคุณหากคุณเรียกใช้สองครั้งหรือบางอย่างโดยไม่ได้ตั้งใจ