ฉันจะ grep สำหรับสตริงที่ขึ้นต้นด้วยขีดกลาง / ขีดคั่นได้อย่างไร


347

ฉันต้องการ grep สำหรับสตริงที่ขึ้นต้นด้วยเครื่องหมายขีดคั่น / ยัติภังค์เช่น-Xในไฟล์ แต่มันทำให้สับสนว่านี่เป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ฉันพยายามแล้ว:

grep "-X"
grep \-X
grep '-X'

คำตอบ:


465

ใช้:

grep -- -X

สิ่งที่เกี่ยวข้อง: เส้นประสองทางเปลือยหมายถึงอะไร (ขอบคุณNutty เกี่ยวกับ Natty )


57
สำหรับพวกเราที่สงสัยในขั้นตอนนี้จะมีความ--หมายว่าอะไรหรือทำอะไร: unix.stackexchange.com/questions/11376/ …
เกี่ยวกับ natty

2
ทำงานร่วมกับ The Silver Searcher (ag) เช่นกัน
Zev Eisenberg

หากคุณต้องการใช้กับตัวแปรที่มีช่องว่างคุณควรใช้สิ่งนี้:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar grep -- "--name awesome"หรือเพียง
Brett Widmeier

@BrettWidmeier ใช่ฉันไม่ควรใช้ตัวแปรมันทำให้คนสับสน
zapstar

57

รีบเป็นตัวละครพิเศษในการทุบตีตามที่ระบุไว้ในhttp://tldp.org/LDP/abs/html/special-chars.html#DASHREF ดังนั้นการหลบหนีครั้งนี้จะทำให้คุณผ่าน Bash แต่ Grep ยังคงมีความหมายของตัวเองในการขีดกลาง (โดยให้ทางเลือก)

ดังนั้นคุณต้องหลบหนีสองครั้งจริง ๆ (ถ้าคุณไม่ต้องการใช้คำตอบอื่น ๆ ที่กล่าวถึง) จะ / ควรจะทำงานต่อไปนี้

grep \\-X
grep '\-X'
grep "\-X"

วิธีหนึ่งในการลองใช้วิธีที่ Bash ส่งผ่านอาร์กิวเมนต์ไปยังสคริปต์ / โปรแกรมคือการสร้างสคริปต์. sh ที่เพียงแค่สะท้อนข้อโต้แย้งทั้งหมด ฉันใช้สคริปต์ที่เรียกว่า echo-args.sh เพื่อเล่นเป็นครั้งคราวทั้งหมดนี้มี:

echo $*

ฉันขอเป็น:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

คุณได้รับความคิด


1
ฉันไม่คิดว่า - เป็นตัวละครพิเศษใน Bash แม้จะมีคำแนะนำ ABS อยู่ก็ตาม Bash ไม่ประมวลผลอาร์กิวเมนต์ที่เริ่มต้นด้วย - แตกต่างจากที่อื่น คำสั่งหรือบิวด์อินที่ Bash การโทรในภายหลังนั้นจะจัดการกับอาร์กิวเมนต์ที่ขึ้นต้นด้วยเส้นประ Bash ในตัวส่วนใหญ่และคำสั่ง Linux และ GNU จัดการ - เป็นตัวเลือกเทอร์มิเนเตอร์ ใช้ 'set -x' เพื่อดูคำสั่งและอาร์กิวเมนต์ที่ Bash ใช้ก่อนที่จะถูกดำเนินการ แต่หลังจาก Bash ได้ขยาย escapes, globs และ braces Grep เป็นตัวอย่างที่น่าสับสนเพราะมันจัดการกับแบ็กสแลชของมันเอง
Noah Spurrier

25

grep -e -X จะทำเคล็ดลับ


1
grep ของฉันไม่มี -e แปลกมาก
Mike

14
โซลาริสสำหรับความพ่ายแพ้
Mike

2
พร้อมใช้งานบน solaris จาก / usr / xpg4 / bin / grep, btw ยูทิลิตี้ที่ครบถ้วนมากขึ้นในไดเรกทอรีนั้น
pra

มันทำงานภายใต้ MinGW ( MinGWไม่สนับสนุน-P(แต่นั่นเป็นอีกเรื่องหนึ่งและไม่ได้ใช้ที่นี่)
Peter Mortensen



7

ฉันไม่สามารถเข้าถึงเครื่อง Solaris ได้ แต่grep "\-X"ทำงานกับฉันบน linux


5

วิธีที่ถูกต้องคือการใช้ "-" เพื่อหยุดการประมวลผลอาร์กิวเมนต์ตามที่ได้กล่าวไปแล้ว นี่เป็นเพราะการใช้งาน getopt_long (GNU C-function จาก getopt.h) ในแหล่งที่มาของเครื่องมือ

นี่คือเหตุผลที่คุณสังเกตเห็นปรากฏการณ์เดียวกันในเครื่องมือบรรทัดคำสั่งอื่น ๆ ; เนื่องจากส่วนใหญ่เป็นเครื่องมือของ GNU และใช้การโทรนี้จึงมีพฤติกรรมเหมือนกัน

ในฐานะที่เป็นหมายเหตุด้าน - getopt_long คือสิ่งที่ทำให้เรามีตัวเลือกที่ดีระหว่าง -rlo และ --really_long_option และการรวมกันของข้อโต้แย้งในล่าม


3

หากคุณกำลังใช้ยูทิลิตีอื่นที่ส่งผ่านอาร์กิวเมนต์เดียวไปยัง grep คุณสามารถใช้:

'[-]X'


-1
ls -l | grep "^-"

หวังว่าคนนี้จะตอบสนองวัตถุประสงค์ของคุณ


2
นิพจน์นี้ตรวจจับเฉพาะบรรทัดที่ขึ้นต้นด้วยเส้นประ มันไม่สอดคล้องกับคำถามเริ่มต้น เขาต้องการค้นหาสตริงที่เริ่มต้นด้วยขีดกลาง แต่บรรทัดที่มีสตริงนี้ไม่จำเป็นต้องเริ่มต้นด้วยขีดกลางในคำถามเริ่มต้นสตริงที่ขึ้นต้นด้วยขีดสามารถอยู่ที่ใดก็ได้ในบรรทัด
Laurent Simon

-1

grep "^ -X" ไฟล์

มันจะ grep และเลือกบรรทัดทั้งหมดในไฟล์ ^ ใน grep "^" หมายถึงบรรทัดที่ขึ้นต้นด้วย


1
มีคำตอบอยู่แล้วซึ่งบอกว่าstackoverflow.com/a/27440348/441757 (โพสต์เมื่อกว่าปีที่แล้ว)
sideshowbarker

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