คำสั่ง Sed ที่ทำงานบน MacOS (อย่างน้อย, OS 10) และ Unix เหมือนกัน (เช่น. ไม่ต้องการ gnu sed เช่น Gilles '(ปัจจุบันยอมรับ))
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
สิ่งนี้ใช้ได้ใน bash และอาจเป็น shell อื่น ๆ ด้วยที่รู้สไตล์การเสนอราคา $ '\ n' ทุกอย่างสามารถอยู่ในหนึ่งบรรทัดและทำงานในคำสั่งเก่า / POSIX sed หากอาจมีหลายบรรทัดที่ตรงกับ CLIENTSCRIPT = "foo" (หรือเทียบเท่าของคุณ) และคุณต้องการเพิ่มบรรทัดพิเศษเฉพาะในครั้งแรกคุณสามารถทำใหม่ได้ดังต่อไปนี้:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(สิ่งนี้จะสร้างลูปหลังจากรหัสการแทรกบรรทัดที่วนรอบส่วนที่เหลือของไฟล์ไม่ต้องกลับไปที่คำสั่ง sed แรกอีกครั้ง)
คุณอาจสังเกตเห็นว่าฉันเพิ่ม '^ *' ในรูปแบบการจับคู่ในกรณีที่บรรทัดปรากฏขึ้นในความคิดเห็นพูดหรือเยื้อง มันไม่ได้สมบูรณ์แบบ 100% แต่ครอบคลุมสถานการณ์อื่น ๆ ที่น่าจะเกิดขึ้น ปรับตามต้องการ ...
สองคนนี้ยังได้รับการแก้ปัญหารอบปัญหา (สำหรับการแก้ปัญหาทั่วไปเพื่อเพิ่มบรรทัด) ว่าถ้าสายแทรกใหม่ของคุณมีเครื่องหมายที่ไม่ใช้ Escape หรือเครื่องหมายที่พวกเขาจะได้รับการตีความโดย sed และมีแนวโน้มที่ไม่ออกมาเหมือนกันเช่นเดียวกับ\n
เป็น - เช่น\0
จะจับคู่บรรทัดแรก มีประโยชน์เป็นพิเศษหากคุณกำลังเพิ่มบรรทัดที่มาจากตัวแปรที่คุณต้องหลีกเลี่ยงทุกอย่างก่อนใช้ $ {var //} มาก่อนหรือใช้คำสั่ง sed อื่นเป็นต้น
วิธีแก้ปัญหานี้มีความยุ่งเล็กน้อยในสคริปต์ (นั่นคือการอ้างถึงและ \ n ไม่ใช่เรื่องง่ายที่จะอ่าน) เมื่อคุณไม่ต้องการใส่ข้อความแทนคำสั่งที่จุดเริ่มต้นของบรรทัดถ้าพูดในฟังก์ชั่น มีเส้นที่เยื้อง ฉันใช้ประโยชน์จากการที่ $ '\ n' ถูกประเมินเป็นบรรทัดใหม่โดยเชลล์ไม่ใช่ค่าที่อยู่ในเครื่องหมายอัญประกาศ '\ n' แบบปกติ
มันใช้เวลานานพอถึงแม้ว่าฉันคิดว่า perl / awk อาจชนะเพราะอ่านง่ายขึ้น