ค้นหา & sed (ค้นหาและแทนที่)


26

ฉันใช้คำสั่งต่อไปนี้ใน mac ของฉัน:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;

และดูเหมือนว่าจะไม่มีผลกระทบ

ฉันมีสองไฟล์ในไดเรกทอรีที่ลงท้ายด้วย. java ซึ่งทั้งคู่มีข้อความ foo อยู่ในนั้น ฉันพลาดอะไรไปรึเปล่า?

แก้ไข: ผลลัพธ์จากการร้องขอความคิดเห็น

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .

2
นั่นคือสิ่งที่คุณกำลังทำงานอยู่หรือ ถ้าคุณลบ-execและทุกสิ่งหลังจากนั้น มันพิมพ์ชื่อของไฟล์ Java หรือไม่? (ฉันกังวลว่าคุณกำลังใช้คำพูดที่สมาร์ทแทนคำพูด ASCII.)
มิเกล

1
ที่จริงแล้วมันแก้ปัญหาได้อย่างน้อยสำหรับฉัน ทั้งเครื่องหมายคำพูดคู่และคำเดี่ยวควรถูกแทนที่ด้วย"และ'ตามลำดับ
Lev Levitsky

2
คำพูดสมาร์ท (?)! .. :)
Peter.O

สิ่งที่ฉันวางคือสิ่งที่ฉันกำลังวิ่ง ใครสามารถโพสต์คำตอบได้ไหม
Amir Afghanani

1
ครั้งต่อไปโปรดโพสต์ข้อความแสดงข้อผิดพลาดที่คุณเห็นเมื่อคุณถามคำถาม มันจะประหยัดเวลาสำหรับทุกคน
มิเคล

คำตอบ:


34

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณใช้เครื่องหมายอัญประกาศ ASCII ปกติเช่น"และ'(รหัส ASCII 0x22และ0x27ตามลำดับ) ในเชลล์สคริปต์เนื่องจากตัวอย่างในโพสต์ของคุณมีอักขระเครื่องหมายคำพูดที่ไม่ได้มาตรฐาน หากคุณมองอย่างใกล้ชิดพวกเขาดูเหมือนแตกต่างกันเล็กน้อย ส่วนใหญ่อาจเป็นข้อผิดพลาดการคัดลอกวางจากรูปแบบเอกสาร Rich Text เช่น Word, OOWriter หรือแม้แต่หน้าต่างเบราว์เซอร์

เนื่องจากคุณใช้ Mac คุณอาจต้องใช้ FreeBSD เป็นส่วนใหญ่sedซึ่งในกรณีนี้คุณต้องเขียนคำสั่งด้วยวิธีนี้:

find . -name "*.java" -exec sed -i '' s/foo/bar/g {} +

(ที่นี่ใช้+แทน\;การหลีกเลี่ยงการเรียกใช้หนึ่งsedการร้องขอต่อไฟล์)

ในการใช้งาน FreeBSD ของsedการ-iตั้งค่าสถานะต้องมีอาร์กิวเมนต์: ส่วนขยายของไฟล์สำรอง ตัวอย่างเช่น-i .bakคำสั่งจะสำรองfile1.txtเป็นfile1.txt.bakครั้งแรกก่อนที่จะทำการแทนที่ในไฟล์ต้นฉบับ การใช้อาร์กิวเมนต์เปล่า''หมายถึงการไม่ใช้ไฟล์สำรองซึ่งน่าจะเป็นสิ่งที่คุณต้องการ

สิ่งเดียวกันในการใช้งาน GNU (หรือ NetBSD, OpenBSD, busybox) จะเป็น:

find . -name "*.java" -exec sed -i s/foo/bar/g {} +

ขอบคุณ@bahamatและ@Mikelและ@ pieter-breedสำหรับการปรับปรุงคำตอบของฉันด้วยความคิดเห็นของคุณ


วงเล็บปีกกาทำอะไร?
เชน Hitchcox

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