ฉันจะแยกข้อความจากไฟล์ในสคริปต์ทุบตีได้อย่างไร

ฉันกำลังพยายามแยกข้อความจากไฟล์หลายบรรทัด ตัวอย่างเช่น ฉันต้องแยกข้อความทั้งหมดจาก "ส่วนที่ 1.0" ถึง "ส่วนที่ 3.0"

นี่อาจเป็นได้หลายบรรทัด

ฉันมีรหัสที่ใช้งานได้ แต่ดูงุ่มง่ามและช้า มีวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่? ซีดเหรอ? นิพจน์ reg?

flag="false"

for line in ${textFile}; 
do
   if [ "$line" == "Section 3.0" ]; then
      flag="false"
   fi
   if [ "$flag" == "true" ]; then
      temp_var+=$line
   fi
   if [ "$line" == "Section 1.0" ]; then
      flag="true"
   fi
done

person Todd Iglehart    schedule 19.03.2014    source แหล่งที่มา


คำตอบ (3)


การใช้ sed คุณสามารถทำได้:

sed -n '/Section 1\.0/,/Section 3\.0/p' file

แก้ไข: หากต้องการละเว้นรูปแบบเริ่มต้นและสิ้นสุด ให้ใช้:

sed -n '/Section 1\.0/,/Section 3\.0/{/Section [13]\.0/!p;}' file

วิธีแก้ปัญหา awk:

awk '/Section 1\.0/{flag=0} flag{print} /Section 3\.0/{flag=1}' file
person anubhava    schedule 19.03.2014
comment
ใช่ ส่วนที่ 1 มาก่อนส่วนที่ 3 รหัสเป็นไปตามที่เป็นอยู่ จึงไม่เขียนชื่อหัวข้อจริง - person Todd Iglehart; 19.03.2014

sed -n '/Section 1\.0/,/Section 3\.0/p' file

จะพิมพ์จาก file ทุกบรรทัดระหว่างบรรทัดที่ตรงกับ regex แรกทุกที่ในนั้นผ่านบรรทัดถัดไปที่ตรงกับนิพจน์ที่สอง หากมีการจับคู่กันหลายรายการ พวกเขาจะพิมพ์เป็นแบบพลิกกลับ (มองหารูปแบบที่ 1 พิมพ์ผ่านรูปแบบที่ 2 มองหารูปแบบที่ 1...)

หากคุณต้องการเฉพาะส่วนแรก คุณสามารถออกได้เมื่อพบเงื่อนไขสิ้นสุด:

sed -n '/Section 3\.0/q;/Section 1\.0/,$p' file

ซึ่งจะไม่รวมบรรทัดที่ตรงกับเงื่อนไขสิ้นสุด (คาดเดาว่านั่นคือสิ่งที่คุณต้องการจริงๆ) เพื่อความง่าย จะถือว่าคุณไม่มีส่วน 3.0 ก่อนส่วน 1.0 (ภาษาถิ่น sed บางภาษาอาจต้องใช้ไวยากรณ์ที่แตกต่างกันเล็กน้อย อาจต้องเปลี่ยนเครื่องหมายอัฒภาคขึ้นบรรทัดใหม่ หรือสคริปต์แบ่งออกเป็นสองอาร์กิวเมนต์ -e แยกกัน)

person tripleee    schedule 19.03.2014

awk ยังสามารถใช้ได้:

awk '/Section 3\.0/{f=0} f; /Section 1\.0/{f=1}' file
person Jotne    schedule 19.03.2014