जवाबों:
आप -b
बाइट ऑफसेट प्राप्त करने के लिए उपयोग कर सकते हैं , जो कि साधारण पाठ के लिए स्थिति के समान है (लेकिन UTF-8 या समान के लिए नहीं)।
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|
उपरोक्त में, मैं -a
इनपुट के रूप में पाठ का उपयोग करने के लिए grep बताने के लिए स्विच का उपयोग करता हूं; बाइनरी फ़ाइलों पर काम करते समय आवश्यक है, और -o
केवल मिलान चरित्र (एस) को आउटपुट करने के लिए स्विच।
यदि आप केवल स्थिति चाहते हैं, तो आप केवल स्थिति निकालने के लिए grep का उपयोग कर सकते हैं:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14
यदि आपको अजीब आउटपुट मिलते हैं, तो यह देखने के लिए जांचें कि क्या grep में रंग सक्षम हैं। आप --colors=never
grep को पास करके या grep कमांड को प्रीफ़िक्स करके रंगों को निष्क्रिय कर सकते हैं \
(जो किसी भी उपनाम को निष्क्रिय कर देगा), जैसे:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14
एक स्ट्रिंग के लिए जो कई मैचों को लौटाती है, head -n1
पहला मैच प्राप्त करने के लिए पाइप करें ।
ध्यान दें कि मैं उपरोक्त दोनों का उपयोग करता हूं, और ध्यान दें कि उत्तरार्द्ध काम नहीं करेगा अगर एक निष्पादन योग्य (स्क्रिप्ट या अन्यथा) के माध्यम से जीआरपी "अलियास" है, केवल उपनाम का उपयोग करते समय।
2
;)
^
:)
0:|
आउटपुट के रूप में मिलता है- क्योंकि 0 उस लाइन की शुरुआत की बाइट स्थिति है जहां |
पाया जाता है।
grep (GNU grep) 2.27
:। क्या आप शायद OS X का उपयोग कर रहे हैं?
प्रयत्न:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
उत्पादन:
15:|
यह आपको सूचकांक आधारित -1 के साथ स्थिति देगा।
printf '%s\n' '|' | grep -o . | grep -n '|'
प्रिंट 1
, 0
अपेक्षा के अनुरूप नहीं ।
यदि आप बैश शेल का उपयोग कर रहे हैं , तो आप बाहरी प्रक्रियाओं जैसे कि grep या awk की आवश्यकता के बिना विशुद्ध रूप से निर्मित परिचालन का उपयोग कर सकते हैं :
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
यह किसी स्ट्रिंग द्वारा अनुसरण की सभी घटनाओं को हटाने और एक अस्थायी चर में सहेजने के लिए एक पैरामीटर विस्तार का उपयोग करता है |
। इसके बाद अस्थायी चर की लंबाई को मापने का एक सूचकांक है |
।
नोट if
अगर जाँच कर रहा है |
मूल स्ट्रिंग में सभी पर मौजूद है। यदि यह नहीं होता है तो अस्थायी चर मूल के समान होगा।
नोट यह भी शून्य आधारित सूचकांक प्रदान |
करता है जो आम तौर पर उपयोगी होता है जब बैंग के तारों को अनुक्रमित किया जाता है। हालाँकि यदि आपको एक-आधारित सूचकांक की आवश्यकता है, तो आप ऐसा कर सकते हैं:
$ echo $((${#tmp}+1))
15
$
आप उन index
वर्णों में स्थिति वापस करने के लिए awk के फ़ंक्शन का उपयोग कर सकते हैं जहाँ मैच होता है:
echo "RAMSITALSKHMAN|1223333"|awk 'END{print index($0,"|")}'
15
यदि आप पर्ल के index
फ़ंक्शन का उपयोग करने में कोई आपत्ति नहीं करते हैं , तो यह शून्य, एक चरित्र की एक या अधिक घटनाओं की रिपोर्टिंग करता है:
echo "|abc|xyz|123456|zzz|" | \
perl -nle '$pos=-1;while (($off=index($_,"|",$pos))>=0) {print $off;$pos=$off+1}'
पठनीयता के लिए, केवल, पाइपलाइन को दो लाइनों में विभाजित किया गया है।
जब तक लक्ष्य वर्ण पाया जाता है, तब तक index
शून्य (0) पर आधारित सकारात्मक मान देता है। इसलिए, स्ट्रिंग "एबीसी | xyz | 123456 | zzz |" जब पार्स रिटर्न 0, 4, 8, 15 और 19 हो।
RAMSITALSKHMAN|1|223333
हम इसे "expr match" या "expr index" का उपयोग करके भी कर सकते हैं
expr मैच $ string $ substring जहाँ $ substring एक RE है।
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
और ऊपर आपको स्थिति देगा क्योंकि यह मिलान किए गए विकल्प की लंबाई लौटाता है।
लेकिन खोज सूचकांक के लिए और अधिक विशिष्ट होना:
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`
awk
समाधान तुच्छ रूप से रिपोर्ट के लिए संशोधित किया जा सकता है इस जानकारी को किसी फ़ाइल की प्रत्येक पंक्ति पर (आपको बस इतना करना है END
, जो कि JRFerguson के उत्तर से, और आवश्यक नहीं था, और अविनाश राज ने यह पहले ही कर दिया था) ; हालांकि expr
, समाधान के साथ ऐसा करने के लिए , आपको एक स्पष्ट लूप जोड़ना होगा (और Gnouc का उत्तर आसानी से ऐसा करने के लिए अनुकूल नहीं है, जिसे मैं देख सकता हूं), और (2) awk
समाधान सभी को रिपोर्ट करने के लिए अनुकूलित किया जा सकता है expr
समाधान की तुलना में प्रत्येक पंक्ति में कुछ हद तक अधिक आसानी से मेल खाता है (वास्तव में, अविनाश राज पहले से ही ऐसा करता है)।
echo `...`
यहां क्यों इस्तेमाल करेंगे ?
$ echo 'RAMSITALSKHMAN|1223333'| awk 'BEGIN{ FS = "" }{for(i=1;i<=NF;i++){if($i=="|"){print i;}}}'
15
फ़ील्ड विभाजक को अशक्त स्ट्रिंग के रूप में सेट करके, awk अलग-अलग फ़ील्ड के रूप में रिकॉर्ड में अलग-अलग वर्ण को बदल देता है।
कुछ विकल्पों में शामिल हैं:
Gnouc के उत्तर के समान, लेकिन शेल के साथ:
echo 'RAMSITALSKHMAN|1223333' |
tr -c \| \\n |
sh
sh: line 15: syntax error near unexpected token `|
sh: line 15: `|'
कई लाइनों के साथ sed
और dc
संभवतः फैले हुए:
echo 'RAMSITALSKHMAN|1223333' |
sed 's/[^|]/1+/g;s/|/p/;1i0 1+' |dc
15
के साथ $IFS
...
IFS=\|; set -f; set -- ${0+RAMSITALSKHMAN|1223333}; echo $((${#1}+1))
यह भी आपको बताएगा कि वहाँ कितने हैं ...
echo $(($#-1))