ฉันต้องการใช้grep
กับนิพจน์ PCRE ที่มี<
อักขระ Bash คิดว่าฉันต้องการเปลี่ยนเส้นทาง แต่ฉันไม่ต้องการ ฉันจะหนีได้<
อย่างไร
ฉันต้องการใช้grep
กับนิพจน์ PCRE ที่มี<
อักขระ Bash คิดว่าฉันต้องการเปลี่ยนเส้นทาง แต่ฉันไม่ต้องการ ฉันจะหนีได้<
อย่างไร
คำตอบ:
ฉันสามารถทำได้ด้วยแบ็กสแลช:
25 % grep \< xmospos.c
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <X11/Xlib.h>
เครื่องหมายคำพูดน้อยกว่าและเครื่องหมายคำพูดทับขวาที่น้อยกว่าทั้งสองให้คำตอบที่โง่
grep -oP '(?< )(.*)$'
ไม่ทำงานกับคำพูดเดียวเช่น พยายามในตอนแรก
(?<! )(.*)$
หรือ(?<= )(.*)$
?
กฎง่ายๆสองข้อ:
\C
หนีอักขระถัดไปไม่ว่าจะเป็นอะไรก็ตามนอกจากบรรทัดใหม่'text'
ยกเว้นอักขระใด ๆ ระหว่างพวกเขารวมถึงเครื่องหมายแบ็กสแลช แต่ไม่รวมถึงเครื่องหมายคำพูดเดี่ยว (เนื่องจากเครื่องหมายนั้นเป็นจุดสิ้นสุดของข้อความที่ยกมา)ดังนั้น:
grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile
หากคุณต้องการส่งอาร์กิวเมนต์ที่มีเครื่องหมายคำพูดเดี่ยวคุณสามารถใช้'\''
เพื่อ "escape" เครื่องหมายคำพูดเดี่ยวในเครื่องหมายคำพูดเดี่ยว ในทางเทคนิคสิ่งนี้จะสิ้นสุดข้อความตัวอักษรแรกจากนั้นใส่ตัวอักษร'
ในคำเดียวกันแล้วตัวอักษรมากขึ้นยังคงอยู่ในคำเดียวกัน
grep '^D'\''oh!' myfile
กฎการอ้างอิงที่เหลือ (สรุป):
!"#$&'()*;<>?[\]^`{|}~
(ในคำอื่น ๆ อักขระต่อไปนี้ปลอดภัย: ตัวอักษรตัวเลข%+,-./:=@_
และอักขระที่ไม่ใช่ ASCII)"$\`
และ !
(ในเปลือกหอยที่มีประวัติเปิดใช้งาน) แบ็กสแลชระหว่างเครื่องหมายคำพูดคู่จะปรากฏในสตริงเว้นแต่ว่าจะนำหน้าอักขระที่ไม่ใช่ตัวอักษรตัวใดตัวหนึ่งกฎเหล่านี้ใช้สำหรับทุบตีและกระสุนสไตล์บอร์นอื่น ๆ (เช่น ash และ ksh) พวกเขานำไปใช้กับ zsh เช่นกัน (ยกเว้นว่า=
หลังจากช่องว่างอาจต้อง quoting) กฎใน csh / tcsh และใน Fish นั้นแตกต่างกัน