कैसे grep द्वारा $ $ की व्याख्या की जा रही है?


12

जब मैं लिखता हूँ

$ grep \$  

फिर मैं टर्मिनल पर जो भी टाइप करता हूं, उसका मिलान किया जाता है और टर्मिनल पर प्रिंट किया जाता है। कैसे \$व्याख्या की जा रही है?

जवाबों:


18

खोल व्याख्या करने के तरीके \$और रूप में ग्रेप के माध्यम से इसे पारित $, लाइन चरित्र के अंत। तो यह मानते हुए कि आपकी लाइन का अंत है, यह :-) से मेल खाएगा

यदि आप $grep में एक वास्तविक मिलान करना चाहते हैं , तो निम्न में से एक का उपयोग करें:

grep \\\$
grep '\$'

पूर्व में, खोल की व्याख्या \\के रूप में \और \$के रूप में $, दे रही है \$। उत्तरार्द्ध में, यह इसकी व्याख्या बिल्कुल नहीं करता है।


जैसा कि आपके प्रश्न \$से दो-वर्ण अनुक्रम के बजाय डॉलर के चिह्न से मेल क्यों होता है, कुछ भावों के grepलिए विशेष वर्णों का उपयोग करने वालों की तरह नियमित अभिव्यक्ति । उनमें से कुछ हैं:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

कई अन्य लोगों के साथ।

जब आप एक शाब्दिक चरित्र से मेल खाना चाहते हैं जो सामान्य रूप से एक विशेष चरित्र के रूप में माना जाता है, तो आपको इसे बचने की आवश्यकता है ताकि grepइसे सामान्य चरित्र के रूप में माना जाए।


1
यह देखने के लिए कि क्या grep देखता है, कोशिश करें echo \$और फिरecho \\$

Grep \\\ $ में, जैसा कि आपने कहा था, $ $ को grep को पारित किया जाता है, इसलिए इसे उन स्ट्रिंग्स से मेल खाना चाहिए, जिनमें \ $ शामिल हैं, लेकिन यह उन स्ट्रिंग से मेल क्यों खा रहा है, जिनमें केवल एक $ है?

क्योंकि $ grep में लाइन का अंत होता है। चरित्र $ से मेल खाने के लिए, आपको इससे बचने की आवश्यकता है, इसलिए grep इसे विशेष रूप से व्यवहार नहीं करता है। मेरा अपडेट देखें

@ पासी: इको अपनी खुद की अनसेफिंग करता है, यह इस बात पर निर्भर करता है कि यह शेल बिल्डिन है या नहीं, पोसिक्स कंप्लेंट है या नहीं, आदि का उपयोग करने के लिए बेहतर (आईएमएचओ) है ls \$और देखें कि हमें "ls: $: ऐसी कोई फ़ाइल या निर्देशिका" नहीं मिली, यह देखने के लिए कि $ $ $ से कम है, लेकिन \\ $ unescaped से $ $ है, और इसी तरह।
हेनो

5

शेल सबसे पहले प्रोग्राम के तर्कों को पारित करने से पहले किसी भी एस्केप सीक्वेंस का विस्तार करता है, इसलिए यह \$एक एस्केप सीक्वेंस के रूप में व्याख्या करता है और एकल तर्क $को पास करता है grep, जो लाइन के अंत से मेल खाता है। चूंकि हर रेखा का अंत होता है, तो किसी भी रेखा का मिलान होना चाहिए :)


लेकिन लाइन का अंत $ कितना है? क्या पंक्ति का अंत \ n नहीं है?

2
@ हप्पी मिथल: देखें man grep; यह निर्णय लिया गया है कि गया है $पंक्ति के अंत से मेल खाता है या नहीं, पंक्तियों से अलग कर रहे हैं की परवाह किए बिना \n, \r, दोनों, या कुछ पूरी तरह से अलग। सामान्य स्थिति में, नियमित अभिव्यक्तियों का उपयोग किसी भी स्ट्रिंग से मेल खाने के लिए किया जा सकता है, न कि केवल एक "लाइन" के लिए, और $स्ट्रिंग के अंत से मेल खाने के लिए उपयोग किया जाता है।

2

इसकी व्याख्या लाइन-मेटेक्रेचर के अंत के रूप में की जा रही है। यदि आप वास्तविक डॉलर के चिह्न का मिलान करना चाहते हैं, तो करें

 $ grep \\$ 

या

 $ grep '\$' 

1

^स्ट्रिंग की शुरुआत के लिए है, और $अंत के लिए।

grep \$

या

grep $

हर स्ट्रिंग से मेल खाएगा, इसलिए आपके द्वारा टाइप की गई कुछ भी प्रतिध्वनित होती है।

प्रयत्न

grep a$

अब, केवल तार जिनके अंतिम चरित्र का aमिलान और गूँज होगा


1

$चरित्र वर्ग के लिए नियमित अभिव्यक्ति का उपयोग करके, यदि आप शाब्दिक खोज करना चाहते हैं, तो आप भागने की परेशानी से बचा सकते हैं । उदाहरण के लिए,

$ grep '[$]' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.