sed หนึ่งซับเพื่อลบทุกอย่างระหว่างวงเล็บหรือไม่


15

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

แล้ววงเล็บ () แทนที่จะเป็นวงเล็บคืออะไร

คำตอบ:


20

แทนที่[some text]ด้วยสตริงว่าง สมมติว่าคุณไม่ต้องการแยกวงเล็บที่ซ้อนกันsome textจะไม่สามารถใส่วงเล็บใด ๆ ได้

sed -e 's/\[[^][]*\]//g'

ทราบว่าในการแสดงออกวงเล็บ[^][]เพื่อให้ตรงกับอะไร แต่[หรือ]ที่]จะต้องมาก่อน โดยปกติแล้ว a ]จะสิ้นสุดชุดอักขระ แต่ถ้าเป็นอักขระตัวแรกในชุด (ที่นี่หลังจาก^อักขระประกอบ), ]หมายถึงตัวของมันเอง

หากคุณต้องการแยกวงเล็บที่ซ้อนกันหรือถ้าข้อความที่อยู่ในวงเล็บสามารถขยายได้หลายบรรทัดแสดงว่าไม่ใช่เครื่องมือที่เหมาะสม


ขอบคุณ @Gilles ... btw มันสามารถขยายหลายบรรทัด แต่ฉันใช้สคริปต์ Perl เพื่อเข้าร่วมบรรทัด ...
ixtmixilix

@ixtmixilix: หากคุณมีสคริปต์ Perl คุณสามารถลบข้อความที่อยู่ในวงเล็บออกได้เช่นกัน ใน Perl คุณสามารถเขียนs/\[[^\[\]]*\]//g(เช่นใช้แบ็กสแลชเพื่อหนีสมาชิกของชุดอักขระ)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

@Gilles คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับ [^] [] ได้อย่างแน่ชัด ขอบคุณ
Arash

1
@arashams […]= ชุดอักขระ ^เป็นตัวอักษรตัวแรกหมายถึงการเติมเต็มชุด ]โดยปกติจะเป็นการทำเครื่องหมายจุดสิ้นสุดของเซต แต่ถ้าเป็นอักขระตัวแรกนอกเหนือจาก^นั้นจะเป็นอักขระทั่วไป - ชุดเปล่าหรือส่วนประกอบเสริมของชุดว่างไม่ได้รับอนุญาต จากนั้น[เป็นเรื่องปกติและ]สิ้นสุดชุด
Gilles 'หยุดความชั่วร้าย'

@Gilles tnx สำหรับความช่วยเหลือของคุณ แต่ฉันยังไม่เข้าใจ: (แปลว่ายาหมายความว่าอะไร? "^ เป็นอักขระตัวแรกที่เติมเต็มชุด" ฉันหมายถึงมันกำลังทำอะไรอยู่) ตัวอย่างเช่นมันจับคู่กับเนื้อหาทั้งหมดหรือไม่
Arash

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