วิธีหลีกเลี่ยง <หรือ> ในพารามิเตอร์ในเชลล์?


10

ฉันต้องการใช้grepกับนิพจน์ PCRE ที่มี<อักขระ Bash คิดว่าฉันต้องการเปลี่ยนเส้นทาง แต่ฉันไม่ต้องการ ฉันจะหนีได้<อย่างไร

คำตอบ:


11

ฉันสามารถทำได้ด้วยแบ็กสแลช:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

เครื่องหมายคำพูดน้อยกว่าและเครื่องหมายคำพูดทับขวาที่น้อยกว่าทั้งสองให้คำตอบที่โง่


5
ใช่หรือใส่ไว้ในเครื่องหมายคำพูดเดียว
glenn jackman

ฉันยังต้องเรียนรู้เช่นวิธีการทำงานกับการหลบหนี: grep -oP '(?< )(.*)$'ไม่ทำงานกับคำพูดเดียวเช่น พยายามในตอนแรก
hakre

@hakre ดูเหมือนว่าจะมีข้อผิดพลาดทางไวยากรณ์ใน regexp ของคุณ คุณหมายถึง(?<! )(.*)$หรือ(?<= )(.*)$?
Gilles 'หยุดชั่วร้าย'

4

กฎง่ายๆสองข้อ:

  • แบ็กสแลชจะ\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 นั้นแตกต่างกัน

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