แทรกสตริงระหว่างสองรูปแบบ


2

ฉันต้องการเปลี่ยนไฟล์ด้วยชื่อเช่น:

d1-a2_A1_B1.txt
abcd_A90_B2.txt

ที่ฉันต้องการแทรก_FOOระหว่างแรก_A[0-9]\+และ_B[0-9]เพื่อให้ชื่อไฟล์

d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt

แต่การแสดงออกปกติของฉันไม่ทำงาน:

for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done

ฉันลองด้วยสายเดี่ยว:

echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/

ตกลง: สิ่งนี้ได้ผล:

echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'

การโพสต์ของคุณจะได้รับการปรับปรุงอย่างมากด้วยการจัดรูปแบบที่ดีขึ้น นี่คือหน้าความช่วยเหลือเกี่ยวกับวิธีการจัดรูปแบบ ฉันจะแก้ไขด้วยตัวเอง แต่มีการแก้ไขอื่นที่ค้างอยู่ดังนั้นฉันจึงไม่สามารถทำได้
Tom Zych

คำตอบ:


0
  • เพิ่ม-rตัวเลือกไปที่sed(เพื่อให้สามารถใช้นิพจน์ปกติแบบขยายโดยปกติจะไม่เข้าใจ+)
  • ใส่sedสคริปต์ของคุณลงในเครื่องหมายคำพูด (ควรเป็นเครื่องหมายคำพูดเดี่ยว)
  • เปลี่ยน$1และ$2ในสคริปต์ของคุณเป็น\1และ\2:

    sed -re ' s /(._ A [0-9] +) (_ B [0-9].) / \ 1_FOO \ 2 / '

นอกจากนี้

  • เพื่อความชัดเจนคุณอาจต้องการที่จะเปลี่ยน`…`ไป$(…)- เห็นนี้ , นี้และนี้ - คือจัดการเช่นเดียวกับคุณจัดการecho | sedls
  • ดีกว่าที่จะพูดfor f in *(มากกว่าfor f in $(ls))
  • คุณควรอ้างอิงการอ้างอิงตัวแปรเชลล์ (เช่นecho "$f") เว้นแต่คุณจะมีเหตุผลที่ดีที่จะไม่ทำและคุณแน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่

ฉันลองแล้ว แต่ใช้งานไม่ได้: echo abcd_A90_B2.txt | sed -e 's /(._ A [0-9] +) (_ B [0-9].) / $ 1_FOO $ 2 /' ที่ไม่เปลี่ยน abcd_A90_B2.txt
2783615

ตกลงฉันแก้ไขคำตอบของฉัน
สกอตต์

0

คุณสามารถหลีกเลี่ยงการใช้ sed และการจัดการสตริงอื่น ๆ โดยใช้mmv:

$ mmv -m -n  '*_A*_B*.txt' '#1_A#2_FOO_B#3.txt'
abcd_A90_B2.txt -> abcd_A90_FOO_B2.txt
d1-a2_A1_B1.txt -> d1-a2_A1_FOO_B1.txt

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.