หากเป็นแบบบรรทัดและมีเพียงหนึ่งบรรทัดที่จะแทนที่ฉันขอแนะนำให้เตรียมไฟล์ของตัวเองด้วยการแทนที่บรรทัดโดยใช้การprintfจัดเก็บบรรทัดแรกนั้นในsedพื้นที่พักไว้และวางลงตามที่ต้องการ ด้วยวิธีนี้คุณไม่ต้องกังวลกับตัวละครพิเศษเลย (ข้อสันนิษฐานเดียวที่นี่คือ$VARมีข้อความบรรทัดเดียวโดยไม่มีบรรทัดใหม่ซึ่งเป็นสิ่งที่คุณพูดในความคิดเห็นแล้ว) นอกเหนือจากการขึ้นบรรทัดใหม่ VAR อาจมีสิ่งใด ๆและสิ่งนี้จะทำงานโดยไม่คำนึงถึง
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'
printf '%s\n'จะพิมพ์เนื้อหา$VARเป็นสตริงตัวอักษรโดยไม่คำนึงถึงเนื้อหาตามด้วยบรรทัดใหม่ ( echoจะทำสิ่งอื่น ๆ ในบางกรณีเช่นหากเนื้อหา$VARเริ่มต้นด้วยเครื่องหมายยัติภังค์ - มันจะถูกตีความว่าเป็นธงตัวเลือกที่ถูกส่งผ่านไปecho)
วงเล็บจะใช้ในการย่อหน้าการส่งออกของprintfเนื้อหาของที่มันผ่านไปsomefile sedช่องว่างแยกวงเล็บปีกกาด้วยตัวเองเป็นสิ่งสำคัญที่นี่เช่นเดียวกับอัฒภาคก่อนที่จะปิดวงเล็บปีกกา
1{h;d;};เป็นsedคำสั่งที่จะเก็บบรรทัดแรกของข้อความในsed's พื้นที่ถือแล้วdหนึ่งคำสาย (แทนที่จะพิมพ์)
/KEYWORD/KEYWORDนำไปใช้ดำเนินการต่อไปกับเส้นทั้งหมดที่มี การดำเนินการคือget ซึ่งรับเนื้อหาของพื้นที่พักและวางแทนที่พื้นที่รูปแบบ - กล่าวอีกนัยหนึ่งคือบรรทัดปัจจุบันทั้งหมด (นี่ไม่ใช่เพื่อแทนที่เพียงส่วนหนึ่งของบรรทัด) พื้นที่เก็บข้อมูลจะไม่ถูกลบออกโดยวิธีการเพียงคัดลอกลงในพื้นที่รูปแบบแทนที่สิ่งที่มีอยู่
หากคุณต้องการที่จะยึด regex ของคุณดังนั้นมันจะไม่ตรงกับบรรทัดที่มี KEYWORD แต่เพียงบรรทัดที่ไม่มีอะไรอื่นในบรรทัดนอกจาก KEYWORD ให้เพิ่มจุดเริ่มต้นของบรรทัด anchor ( ^) และ end of line anchor ( $) เพื่อ regex ของคุณ:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'
sedและไม่ให้เป็นอักขระพิเศษเพียงแค่แบ็กสแลชหนีออกมาVAR='hi\/'ไม่มีปัญหาดังกล่าว