2010-01-21 14 views
21

मैं एक बड़ी स्ट्रिंग में एक छोटी स्ट्रिंग के लिए grep करने की कोशिश कर रहा हूँ। दोनों तार चर के रूप में जमा किया जा रहा है और यहाँ एक कोड उदाहरण है:मैं चर में जटिल स्ट्रिंग कैसे कर सकता हूं?

#!/bin/bash 

long_str=$(man man) 
shrt_str="guide" 

if grep -q $shrt_str $long_str ; then 
     echo "Found it!" 
fi 

मैं चर विस्तार तरह से मैं यह करने की उम्मीद कर रहा है नहीं लगता है। मैंने [ ] और [[ ]] की कोशिश की है, जो चर को उद्धृत करते हैं और आउटपुट को /dev/null पर पाइप करते हैं लेकिन इससे कोई फर्क नहीं पड़ता कि मैं क्या करूँगा यह काम नहीं करेगा।

क्या किसी के पास कोई विचार है?

+0

https://superuser.com/questions/748724/pass-a-large-string-to-grep-instead-of-a-file-name | https://unix.stackexchange.com/questions/163810/grep-on-a-variable –

उत्तर

31
echo "$long_str" | grep -q "$shrt_str" 
if [ $? -eq 0 ];then 
    echo "found" 
fi 

या

echo "$long_str" | grep -q "$shrt_str" && echo "found" || echo "not found" 

चाहते लेकिन: आप stdin के रूप में एक चर का उपयोग करना चाहते हैं तो आप पार्टी के herestring संकेतन का उपयोग करने की आवश्यकता है बैश खोल, फिर खोल आंतरिक का उपयोग करें। बाहरी आदेशों

कॉल करने के लिए कोई ज़रूरत नहीं
shrt_str="guide" 
case "$long_str" in 
    *"$shrt_str"*) echo "Found";; 
    *) echo "Not found";; 
esac 
+1

अच्छा। उपरोक्त केस स्टेटमेंट मूल 'sh' में भी मान्य होना चाहिए। –

+1

हां, अगर यह गलत नहीं है, तो इसे बोर्न पर भी काम करना चाहिए। – ghostdog74

+0

यह सही है। धन्यवाद। – Craig

13

grep फाइल या stdin के लिए है। के बाद से आप उपयोग कर रहे

if grep -q "$shrt_str" <<< "$long_str" ; then 
6

आप

if echo $long_str | grep -q $shrt_str; then 
5

एक और बैश विशेष तकनीक:

if [[ $long =~ $short ]] # regex match 
then 
    echo "yes" 
fi 

लेकिन अगर आप एक चर में लंबी स्ट्रिंग की जरूरत नहीं है, तो:

if man man | grep $short; then ... 

लेकिन मैं मैं मानता हूं कि सिर्फ एक उदाहरण के उद्देश्य के लिए था।

+0

मैंने = ~ समाधान की कोशिश की लेकिन यह काम नहीं किया। न ही परीक्षण आदमी पृष्ठ में ऑपरेटर के रूप में "~" शामिल है। – Craig

+0

'= ~' 'test' ऑपरेटर नहीं है, यह एक बैश ऑपरेटर है (डबल स्क्वायर ब्रैकेट नोट करें)। यह ksh और zsh में भी काम करता है। –

संबंधित मुद्दे