ฉันจะเพิ่ม bash one-liner ของฉันให้เป็นค่าเริ่มต้นได้อย่างไร


0

ฉันมีในสคริปต์ที่ครอบคลุมหนึ่งซับนี้:

grep -P -o "(?s)description\".+>" ./Hlinks.html \
  | grep -P -o "(?s)ISBN[^:]{0,1}: {0,1}[-0-9X]+[ \|]*" \
  | perl -p -e  "s/ISBN[^:]*:*|[\|| ]//g"
  | sed -n "/.*/p;1q"  > ./nISBN.txt

ตอนนี้ฉันต้องการรับเอาท์พุทเริ่มต้น (fe "NA") เมื่อหนึ่งซับออกไม่มีอะไร ฉันจะทำให้หนึ่งซับของฉันสมบูรณ์ขึ้นเพื่อรับความปรารถนานี้ได้อย่างไร

ขอบคุณมาก

วอลเตอร์


มีการตรวจสอบที่คุณสามารถทำกับค่าส่งคืนที่จุดต่าง ๆ ในบรรทัดไปป์ไลน์ แต่สิ่งนี้จะซับซ้อนยิ่งขึ้น ; [ -s ./nISBN.txt ] || echo N.A. >./nISBN.txtคำตอบที่ราคาถูกและร่าเริงคือการผนวก
AFH

@ AFH ขอบคุณ แต่ตอนนี้ฉันมีสิ่งนี้: มันใช้งานไม่ได้ฉันใช้มันถูกต้องหรือไม่? cat $1 | grep -P -o "(?s)ISBN[^:]{0,1}: {0,1}[-0-9X]+[ \|]*" | perl -p -e "s/ISBN[^:]*:*|[\|| ]//g" | sed -n "/.*/p;1q" > ./nISBN.txt; [ -s ./nISBN.txt ] || echo N.A. > ./nISBN.txtฉันลืมที่จะพูดว่า: ไฟล์. /nISBN.txt อยู่ที่นั่นเสมอ (ISBN แบบเก่าเป็นงานเก่า)
Walter Schrabmair

ดูเหมือนว่าจะถูกต้องแม้ว่าสคริปต์ต้นฉบับจะไม่เหมือนกับคำถามของคุณ ไม่ว่าจะ./nISBN.txtมีอยู่ก่อนหน้านี้หรือไม่ก็ไม่สำคัญ - มันจะถูกเขียนทับเสมอ ไม่ทำงานอะไร ไฟล์ว่างเปล่าไม่ถูกเขียนทับด้วยN.A.หรือไม่? หรือไฟล์ถูกเขียนทับเสมอไม่ว่าจะว่างเปล่าหรือไม่?
AFH

ฉันได้ทำการดัดแปลงเพื่อการทดสอบ (เพื่อให้ฉันสามารถใส่อักขระคอนโซล) ฉันได้รับไฟล์. / nISBN.txt ที่ว่างด้วย 0 ไบต์บน dir ไม่มี NA ในนั้นหากฉันป้อนไม่มีคำหลัก ISBN
วอลเตอร์ Schrabmair

ที่นี่ฉันได้ทำกับผู้แก้ไขที่ถูกต้องแล้ว: cat $1 | grep -P -o "(?s)ISBN[^:]{0,4}: {0,1}[-0-9X]+[ \|]*" | perl -p -e "s/ISBN[^:]*:*|[\|| ]//g" | sed -n "/.*/p;1q" > ./nISBN.txt; [ -s ./nISBN.txt ] || echo N.A. > ./nISBN.txtและฉันป้อน fe ISBN-13: 23232 ฉันได้รับ 23232 ในไฟล์: แต่เมื่อฉันป้อน INNNN: 34343 ฉันจะได้ไฟล์ที่ว่างเปล่า แต่ฉันต้องการได้รับในกรณีนี้: NA
Walter Schrabmair

คำตอบ:


0

ไพพ์ไลน์ของคุณสามารถยุบลงในสคริปต์ Perl เดียวเนื่องจาก Perl สามารถทำทุกอย่างที่ grep และ sed สามารถทำได้ สิ่งที่ต้องการ

perl -nE '
    $found = 0;
    if (/description\".+>/ && /ISBN[^:]?:\s*([-0-9X]+[ \|]*)/) {
        $found = 1;
        say $1;
    }
    END {say "N/A" unless $found}
' ./Hlinks.html  > ./nISBN.txt

grep เป็นเครื่องมือที่เน้นการใช้งานเชิงเส้นดังนั้นฉันไม่แน่ใจว่าสิ่ง(?s)นี้จะทำสิ่งใดเพื่อคุณ

เมื่อย้อนกลับไปคุณควรใช้ตัวแยกวิเคราะห์ HTML กับข้อมูลนั้น: นิพจน์ทั่วไปนั้นไม่มีประสิทธิภาพเพียงพอที่จะแยกวิเคราะห์ HTML -> https://stackoverflow.com/q/4598162/7552


ขอบคุณ แต่คุณสามารถแก้ไขคำตอบที่สมบูรณ์แบบของคุณเพื่อให้ฉันสามารถทำงานกับไฟล์อินพุตแทน imput ของคอนโซลได้หรือไม่
Walter Schrabmair

ฉันไม่เข้าใจ ฉันให้ชื่อไฟล์หลังจากปิดเครื่องหมายคำพูดเดี่ยว ฉันเพิ่มการเปลี่ยนเส้นทางผลลัพธ์
เกล็นแจ็

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