เนื่องจากคุณต้องจับคู่เนื้อหาโดยไม่รวมเนื้อหานั้นไว้ในผลลัพธ์ (ต้องตรงname="
แต่ไม่ใช่ส่วนหนึ่งของผลลัพธ์ที่ต้องการ) จำเป็นต้องมีรูปแบบการจับคู่ความกว้างศูนย์หรือการจับภาพกลุ่มบางรูปแบบ สามารถทำได้อย่างง่ายดายด้วยเครื่องมือต่อไปนี้:
Perl
ด้วย Perl คุณสามารถใช้n
ตัวเลือกเพื่อวนซ้ำทีละบรรทัดและพิมพ์เนื้อหาของกลุ่มการจับภาพหากตรงกับ:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
หากคุณมี grep เวอร์ชันที่ปรับปรุงแล้วเช่น GNU grep คุณอาจมี -P
ตัวเลือกให้ ตัวเลือกนี้จะเปิดใช้ regex เหมือน Perl ทำให้คุณสามารถใช้\K
ซึ่งเป็นการมองชวเลขที่อยู่เบื้องหลัง มันจะรีเซ็ตตำแหน่งการจับคู่ดังนั้นสิ่งใดก็ตามก่อนที่จะมีความกว้างเป็นศูนย์
grep -Po 'name="\K.*?(?=")' filename
o
ทำให้ตัวเลือก grep พิมพ์เฉพาะข้อความที่ตรงกันแทนของสายทั้ง
Vim - โปรแกรมแก้ไขข้อความ
อีกวิธีหนึ่งคือการใช้โปรแกรมแก้ไขข้อความโดยตรง ด้วย Vim หนึ่งในวิธีต่างๆในการทำสิ่งนี้คือการลบบรรทัดโดยไม่ต้อง
name=
แล้วแยกเนื้อหาออกจากบรรทัดผลลัพธ์:
:v/.*name="\v([^"]+).*/d|%s//\1
grep มาตรฐาน
หากคุณไม่สามารถเข้าถึงเครื่องมือเหล่านี้ด้วยเหตุผลบางประการสิ่งที่คล้ายกันนี้สามารถทำได้ด้วย grep มาตรฐาน อย่างไรก็ตามหากไม่มีการมองไปรอบ ๆ จะต้องมีการล้างข้อมูลในภายหลัง:
grep -o 'name="[^"]*"' filename
หมายเหตุเกี่ยวกับการบันทึกผลลัพธ์
stdout
ในทุกคำสั่งดังกล่าวผลจะถูกส่งไป สิ่งสำคัญคือต้องจำไว้ว่าคุณสามารถบันทึกได้ตลอดเวลาโดยการลากไปที่ไฟล์โดยต่อท้าย
> result
ไปยังจุดสิ้นสุดของคำสั่ง