หยิบส่วนหนึ่งจากไฟล์ขนาดใหญ่ระหว่างสองสตริงย่อยที่รู้จักกันโดยใช้ sed?


1

ฉันมีไฟล์ XML ที่ค่อนข้างใหญ่โดยไม่มีการแบ่งบรรทัด

มันใหญ่มากมันช้าที่จะเปิดและทำงานใน Emacs หรือโปรแกรมแก้ไขข้อความอื่น ๆ แต่ฉันแค่ต้องการแยกส่วนที่ขาดหายไปของมันระหว่างสองสตริงย่อยที่รู้จัก

ฉันไม่สนใจที่จะรักษาโครงสร้าง XML ไว้ฉันแค่อยากได้ตัวละคร

นี่น่าจะเป็นสายการบินเดียวที่ใช่ไหม?

ความคิดใด ๆ วิธีการทำเช่นนี้? ฉันพยายามปรับhttps://stackoverflow.com/questions/13242469/how-to-use-sed-grep-to-extract-text-between-two-wordsแต่ดูเหมือนจะไม่ทำงานเมื่อฉันไปที่ไฟล์ของฉันเป็น มัน. (มันใช้ได้กับตัวอย่างของเล่น แต่ฉันคิดว่าไฟล์ของฉันอาจใหญ่เกินไป)


คุณเข้าถึง GNU sed และ / หรือ GNU grep หรือไม่
Cyrus

ฉันถือว่าฉันเป็น Ubuntu
interstar

คำตอบ:


2

ด้วย GNU grep:

ด้วยfrompatternและtopatternในการส่งออก:

grep -o 'frompattern.*topattern' file.xml

โดยไม่ต้องfrompatternและtopatternในการส่งออก:

grep -Po 'frompattern\K.*(?=topattern)' file.xml

มันบอกว่าgrep: Not a recognized flag: P grep: Not a recognized flag: oในเปลือกของฉัน คุณช่วยฉันด้วยรหัสอื่นได้ไหม @Cyrus
learner1

@ learner1: ลองนี้กับ GNU sed หรือไม่ GNU sed:sed 's/.*frompattern\(.*\)topattern.*/\1/ file.xml
ไซรัส

1

ปกติแล้วมันจะง่ายสำหรับ sed แต่มันง่ายเสมอที่จะทำด้วย awk:

awk '/frompattern/,/topattern/' your.xml > chunk.xml

ที่นี่ทั้งสองรูปแบบเป็นการแสดงออกปกติ (เช่นเดียวกับ sed) หากคุณไม่สนับสนุนด้วยเหตุผลใดก็ตามคุณสามารถใช้สตริงแบบง่าย ๆ ได้หากคุณรู้ว่ามันอยู่ที่ไหน:

awk '$x=="fromstring",$y=="tostring"' your.xml > chunk.xml

ที่นี่ x และ y คือตำแหน่งฟิลด์ของสตริงที่คุณต้องการให้เป็นสัญญาณกีดขวาง (สามารถทำได้มากกว่านี้ด้วยความพยายามเพียงเล็กน้อย)


ไม่พวกมันดูเหมือนจะไม่ทำงาน ครั้งแรกให้ฉันกลับเอกสารทั้งหมด (โปรดจำไว้ว่าไม่มีการแบ่งบรรทัดดังนั้นเอกสารอยู่ในบรรทัดเดียว) และครั้งที่สองดูเหมือนจะไม่สร้างผลลัพธ์ใด ๆ เลย
interstar

2
อ่าไม่เป็นไร ดังนั้นเราจะต้องตั้งค่าตัวคั่นเร็กคอร์ด (ทั้งสำหรับอินพุทและเอาท์พุท) เป็นสิ่งที่สมเหตุสมผลมากกว่า linebreak และนั่นจะเป็น ">" ที่นี่: awk -vRS = '>' -vORS = '>' '/ frompattern /, / topattern / 'your.xml> chunk.xml สำหรับรุ่นสตริงเข้มงวดใช่เพราะมันยากที่จะเล็งไปที่ฟิลด์ Nth เมื่อไม่มีบรรทัดจริงจึงไม่มีเหตุผลที่นี่
Gombai Sándor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.