รหัสคำสั่งที่ไม่ถูกต้องแม้จะมีระยะเวลาหลบหนีโดยใช้ sed


187

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

อย่างไรก็ตามด้วยคำสั่ง sed ฉันคาดว่าจะทำงาน:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

ฉันได้รับข้อผิดพลาดสำหรับไฟล์ทุกไฟล์:

sed: 1: ".//file/path ...": invalid command code .

ฉันพยายามที่จะหลบหนีจากช่วงเวลาในการแข่งขัน / แทนที่ แต่ไม่ได้แก้อะไรเลย

คำตอบ:


476

หากคุณอยู่ใน OS X นี่อาจไม่มีส่วนเกี่ยวข้องกับคำสั่ง sed ในรุ่น OSX ของsedที่-iตัวเลือกที่คาดว่าจะมีextensionการโต้แย้งเพื่อให้คำสั่งของคุณจะแยกจริงเป็นextensionข้อโต้แย้งและเส้นทางของแฟ้มถูกตีความว่าเป็นรหัสคำสั่ง

ลองเพิ่ม-eอาร์กิวเมนต์อย่างชัดเจนและกำหนดให้''เป็น-i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

ดูนี่สิ


41
หากคุณใช้เวลา 10 นาทีเช่นผมไม่หาที่แตกต่างกันก็เป็นตัวเลือกอี
acheron55

9
คำถามนี้ตอบRE error: illegal byte sequenceบน MacOS
JonasVautherin

11
ฉันใช้สตริงว่าง '' เป็นพารามิเตอร์สำหรับ -i และใช้งานได้เช่นsed -i '' 's/blah/xx/g'
Pierre Houston

25
สำหรับฉันเพิ่ม-eหลังจาก-iทำsedสำรองไฟล์ทั้งหมดของฉันด้วยวิธีนี้: "foo.txt" -> "foo.txt-e" เห็นได้ชัดว่าสิ่งที่ฉันต้องการคือค่อนข้าง-i ''ไม่สำรองไฟล์ที่เปลี่ยนแปลง
mdup

3
ปัญหาเดียวกันสำหรับฉัน สิ่งนี้-i -eรวมกับfindไฟล์หลายไฟล์ที่ลงท้าย-e-e-e-e-e-e-eด้วย
aspyct

39

-iคุณก็ลืมที่จะจัดหาโต้แย้งไปยัง การเปลี่ยนแปลงเพียงเพื่อ-i-i ''

แน่นอนว่าคุณไม่ต้องการให้ไฟล์สำรอง -i .bakมิฉะนั้นจัดหาส่วนขยายของทางเลือกเช่น


6

บน OS X ไม่มีอะไรช่วยให้ตัวบิลท์อินดีจนเหลือเพียงพอ ทางออกคือ:

brew install gnu-sed

จากนั้นใช้ gsed แทน sed ซึ่งจะใช้งานได้ตามที่คาดไว้


1
ขอบคุณสำหรับคำตอบนี้ซึ่งใช้งานได้ดีสำหรับฉัน! ทำงานกับทั้ง Linux และ Mac ฉันต้องการที่จะเข้าถึงเครื่องมือที่คุ้นเคยมากกว่าการเรียนรู้ความแตกต่างระหว่างสองสิ่งที่เกี่ยวข้องอย่างใกล้ชิด
Stephen Shank

3

อาจมีโดเมนใหม่ของคุณ/หรือ ถ้าเป็นเช่นนั้นลองใช้คั่นอื่นนอกเหนือจาก/ในsedเช่น#, ,ฯลฯ

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

นอกจากนี้ยังเป็นการดีที่จะใส่ไว้s///ในเครื่องหมายคำพูดเดี่ยวแทนที่จะพูดซ้ำเพื่อหลีกเลี่ยงการแทนที่ตัวแปรหรือพฤติกรรมอื่น ๆ ที่ไม่คาดคิด

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