หากเป็นแบบบรรทัดและมีเพียงหนึ่งบรรทัดที่จะแทนที่ฉันขอแนะนำให้เตรียมไฟล์ของตัวเองด้วยการแทนที่บรรทัดโดยใช้การ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
นำไปใช้ดำเนินการต่อไปกับเส้นทั้งหมดที่มี การดำเนินการคือg
et ซึ่งรับเนื้อหาของพื้นที่พักและวางแทนที่พื้นที่รูปแบบ - กล่าวอีกนัยหนึ่งคือบรรทัดปัจจุบันทั้งหมด (นี่ไม่ใช่เพื่อแทนที่เพียงส่วนหนึ่งของบรรทัด) พื้นที่เก็บข้อมูลจะไม่ถูกลบออกโดยวิธีการเพียงคัดลอกลงในพื้นที่รูปแบบแทนที่สิ่งที่มีอยู่
หากคุณต้องการที่จะยึด 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\/'
ไม่มีปัญหาดังกล่าว