ใช้การเปลี่ยนชื่อรักษาส่วนหนึ่งของ regex การค้นหา


8

เช้า

โครงการปัจจุบันที่ฉันต้องทำงานมีรูปแบบการตั้งชื่อก่อนหน้านี้ที่รบกวนฉัน ...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

ฉันได้รับการบอกว่า "a" ในเวอร์ชันนี้คือการระบุ "อัลฟา" ที่จำเป็นต้องใช้งานมากกว่านี้ ในขั้นตอนนี้ฉันสามารถลบ "a" และแทนที่ด้วย ".1" (v2a -> v2.1)

มีไฟล์จำนวนมากเกินกว่าที่ฉันจะทำเอง

ฉันรู้ว่าฉันสามารถใช้คำสั่ง rename เพื่อเปลี่ยนชื่อไฟล์ทั้งหมดในครั้งเดียว แต่ฉันพบปัญหาเกี่ยวกับวิธีการทำเช่นนั้น ถ้าฉันใช้สิ่งที่ชอบ:

rename 's/[0-9]a/.1/' *

จากนั้นฉันจะสูญเสียตัวเลขหลักสุดท้ายของหมายเลขเวอร์ชัน มีวิธีการเปลี่ยนชื่อ (หรือเครื่องมือบรรทัดคำสั่งอื่น) จำส่วนหนึ่งของ regex ที่ใช้ในการค้นหาไฟล์หรือไม่ ดังนั้น '[0-9] a' ถึง '[0-9] .1' จะเปลี่ยน 1a เป็น 1.1 และ 4a เป็น 4.1 เป็นต้น


นั่นเป็นความคิดที่ไม่ดี v2a < v2 < 2.1มักจะ กล่าวอีกนัยหนึ่งเวอร์ชัน two-alpha หมายถึงเวอร์ชันที่นำไปสู่เวอร์ชันสองไม่ใช่เวอร์ชันหลังจากนั้น มันจะเป็นการดีกว่าถ้าจะเปลี่ยนชื่อเป็นเวอร์ชั่น1.99หรือสิ่งที่คล้ายกัน
jpaugh

คำตอบ:


15

คุณสามารถใช้กลุ่มการจับภาพ :

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

หรือคุณสามารถใช้lookbehind :

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

หรือคล้ายกับ lookbehind การยืนยันความยาว 0 \Kซึ่งหมายความว่า "ลืมทุกอย่างที่ตรงกันจนถึงจุดนี้":

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

โปรดทราบว่าผมใช้สั้นแทน\d [0-9]ทั้งสองมีความเทียบเท่า แต่renameเป็นสคริปต์ Perl ดังนั้นจึงเข้าใจไวยากรณ์ของ Perl Compatible Regular Expressions (PCRE)

หมายเหตุว่านี้จะมีการเปลี่ยนแปลงเกิดขึ้นครั้งแรกaของตัวเลขตามด้วย นี่อาจเป็นหรือไม่เป็นสิ่งที่คุณต้องการขึ้นอยู่กับชื่อไฟล์ของคุณ

-nทำให้renameแสดงสิ่งที่มันจะทำจริงโดยไม่ต้องทำอะไร เมื่อคุณยืนยันว่าใช้งานได้ตามที่คาดไว้ให้ลบออกเพื่อเปลี่ยนชื่อไฟล์


8

แก้ไขคำสั่งด้วยวิธีนี้:

rename 's/([0-9])a/$1.1/' *
  • คำสั่งการs/<souce>/<replacement>/แทนที่จะแทนที่สตริงต้นฉบับ (ซึ่งอาจเป็นนิพจน์ทั่วไป) ด้วยสตริงการแทนที่
  • กลุ่มจับ - ชิ้นส่วนของสตริงแหล่งที่มาที่ถูกล้อมรอบด้วยวงเล็บ: (regexp), (string)ฯลฯ จะได้รับมอบหมายให้เป็นค่าของตัวแปรต่อเนื่อง: $1, $2ฯลฯ ..
  • ดังนั้นภายในสตริงทดแทนตัวแปร$1จะถูกขยายด้วยค่าของมันว่าในกรณีนี้ต้องตรงกับ [0-9]regexp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.