लिनक्स शेल स्ट्रिंग्स में% क्या करता है?


28

लिनक्स शेल में,% क्या करता है:

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done

4
हर बार जब मैं इसे देखता हूं, तो मैं आमतौर पर बैश मैन पेज का सही खंड खोजता हूं %%या खोजता हूं ##, क्योंकि यह यादगार और दुर्लभ है ताकि सही अनुभाग जल्दी मिल जाए। man bash /##
पीटर कॉर्ड्स

3
@PeterCordes मैं इसे हमेशा याद रखता हूं "यह 5% है, इसलिए% अंत में है और इस तरह अंत से कट जाता है। और यह # 5 है, इसलिए # शुरुआत से है और शुरू से ही कट रहा है।" लेकिन कभी-कभी मैं इस एक को भी मिला देता हूं ...
glglgl

2
@glglgl: एक विशिष्ट यूएसए कीबोर्ड पर, #तुरंत बाईं ओर है $, और %तुरंत दाईं ओर है। कोई मेमेनिक की जरूरत नहीं है --- बस नीचे देखें। (यह शायद उन प्रतीकों को क्यों चुना गया था का कम से कम हिस्सा है।)
केविन जे। चेस

@ KevinJ.Chase दुनिया भर में सभी के पास विशिष्ट यूएसए कीबोर्ड नहीं है। लेकिन वास्तव में, जर्मन कीबोर्ड पर,% $ के रूप में अच्छी तरह से सही है, यह याद रखने के लिए एक शुरुआत हो सकती है।
ग्लोगल सेप

जवाबों:


29

जब %इसका उपयोग पैटर्न में किया जाता है तो ${variable%substring}यह वापस से हटाए गए variableकम से कम प्रदूषण के साथ सामग्री लौटाएगा ।substringvariable

यह फ़ंक्शन वाइल्डकार्ड पैटर्न का समर्थन करता है - यही कारण है कि यह स्टार (तारांकन) को शून्य या अधिक वर्णों के लिए एक विकल्प के रूप में स्वीकार करता है।

यह उल्लेख किया जाना चाहिए कि यह बैश विशिष्ट है - अन्य लिनेक्स के गोले इस समारोह में नहीं हैं।

यदि आप बैश में स्ट्रिंग हेरफेर के बारे में अधिक जानना चाहते हैं, तो मैं इस पृष्ठ को पढ़ने का सुझाव देता हूं । अन्य आसान कार्यों के बीच - उदाहरण के लिए - बताते हैं कि क्या करता %%है :)

संपादित करें: मुझे लगता है कि जब यह पैटर्न में प्रयोग किया जाता है उल्लेख करना भूल गया $((variable%number))या चरित्र सापेक्ष ऑपरेटर के रूप में कार्य करेंगे। डेविडपोस्टिल के पास अपने उत्तर में अधिक विशिष्ट दस्तावेज लिंक हैं।$((variable1%$variable2))%

जब %विभिन्न संदर्भों में उपयोग किया जाता है, तो इसे केवल नियमित चरित्र के रूप में मान्यता दी जानी चाहिए।


2
ऑपरेटर वाइल्डकार्ड पैटर्न का समर्थन करता है , नियमित अभिव्यक्ति का नहीं।
बाग़ीह

गार्डनहेड का उल्लेख किया गया है - यह नियमित रूप से नहीं, ग्लोब पैटर्न का समर्थन करता है। नियमित अभिव्यक्ति में एक स्टार का मतलब शून्य या पिछले चरित्र से अधिक है।
स्लीपबेटमैन

5
आपके द्वारा लिंक किया गया गाइड अधिकांश यूनिक्स और लिनक्स स्टैक एक्सचेंज उपयोगकर्ताओं द्वारा अनुशंसित नहीं है । मैं इसके बजाय वूल्श बैश गाइड की सलाह देता हूं ।
वाइल्डकार्ड

3
उपसर्ग और प्रत्यय हटाने वाले ऑपरेटर मानक हैं , इसलिए उन्हें किसी भी- shअसंगत शेल में उपयोग करने योग्य होना चाहिए , न केवल बैश। (हालांकि शायद cshऔर इस तरह नहीं)।
ilkkachu

1
एक और संदर्भ जिसका %उपयोग किया जाता है, के लिए प्रारूप विनिर्देशक में होता है printf
अगली सूचना तक रोक दिया गया।

9

बैश संदर्भ मैनुअल: शेल पैरामीटर विस्तार

${parameter%word}
${parameter%%word}

शब्द बस फ़ाइलनाम विस्तार में के रूप में एक पैटर्न का उत्पादन करने के लिए विस्तारित किया गया है। यदि पैटर्न पैरामीटर के विस्तारित मूल्य के एक अनुगामी हिस्से से मेल खाता है , तो विस्तार का परिणाम सबसे कम मिलान पैटर्न ( केस) या सबसे लंबे मिलान पैटर्न ( केस) के साथ पैरामीटर का मान हटा दिया जाता है। यदि पैरामीटर है या पैटर्न हटाने का ऑपरेशन बदले में प्रत्येक स्थितीय पैरामीटर पर लागू होता है, और विस्तार परिणामी सूची है। यदि पैरामीटर एक ऐरे वेरिएबल है जिसे या के साथ सब्स्क्रिप्ट किया जाता है‘%’‘%%’‘@’‘*’,‘@’‘*’, पैटर्न रिमूवल ऑपरेशन को एरे के प्रत्येक सदस्य पर बदले में लागू किया जाता है, और विस्तार परिणामी सूची है।


2
एनबी कुछ पैरामीटर विस्तार सहित% पॉज़िक्स विशेषताएं हैं जो कई शेल का समर्थन करती हैं।
कोजिरो

7

प्रयोग करने से, मुझे पता चलता है कि% के बाद एक मैच छूट गया है, जब स्ट्रिंग घुंघराले कोष्ठक (ब्रेस) में संलग्न है।

चित्रित करना:

touch abcd         # Create file abcd

for file in ab*; do
 echo $file        # echoes the filename
 echo $file%       # echoes the filename plus "%"
 echo ${file%}     # echoes the filename
 echo "${file%}"   # echoes the filename
 echo
 echo "${file%c*}" # Discard anything after % matching c*
 echo "${file%*}"  # * is not greedy
 echo ${file%c*}   # Without quotes works too
 echo "${file%c}"  # No match after %, no effect
 echo $file%c*     # Without {} fails
done

यहाँ उत्पादन है:

abcd
abcd%
abcd
abcd

ab
abcd
ab
abcd
abcd%c*

7

लिनक्स शेल ( bash) में, क्या करता %है?

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done

इस विशेष मामले में, %है पैटर्न मिलान ऑपरेटर (ध्यान दें यह भी एक हो सकता है सापेक्ष ऑपरेटर)।


पैटर्न मिलान ऑपरेटर

$ {var% $ पैटर्न}, $ {var %% $ पैटर्न}

${var%$Pattern}$varउस सबसे छोटे भाग से निकालें जिसके पिछले $Patternसिरे से मेल खाता है $var

${var%%$Pattern}$varउस सबसे लंबे भाग से निकालें जिसके पिछले $Patternसिरे से मेल खाता है $var

उदाहरण: पैरामीटर प्रतिस्थापन में पैटर्न का मिलान

#!/bin/bash
# patt-matching.sh

# Pattern matching  using the # ## % %% parameter substitution operators.

var1=abcd12345abc6789
pattern1=a*c  # * (wild card) matches everything between a - c.

echo
echo "var1 = $var1"           # abcd12345abc6789
echo "var1 = ${var1}"         # abcd12345abc6789
                              # (alternate form)
echo "Number of characters in ${var1} = ${#var1}"
echo

echo "pattern1 = $pattern1"   # a*c  (everything between 'a' and 'c')
echo "--------------"
echo '${var1#$pattern1}  =' "${var1#$pattern1}"    #         d12345abc6789
# Shortest possible match, strips out first 3 characters  abcd12345abc6789
#                                     ^^^^^               |-|
echo '${var1##$pattern1} =' "${var1##$pattern1}"   #                  6789      
# Longest possible match, strips out first 12 characters  abcd12345abc6789
#                                    ^^^^^                |----------|

echo; echo; echo

pattern2=b*9            # everything between 'b' and '9'
echo "var1 = $var1"     # Still  abcd12345abc6789
echo
echo "pattern2 = $pattern2"
echo "--------------"
echo '${var1%pattern2}  =' "${var1%$pattern2}"     #     abcd12345a
# Shortest possible match, strips out last 6 characters  abcd12345abc6789
#                                     ^^^^                         |----|
echo '${var1%%pattern2} =' "${var1%%$pattern2}"    #     a
# Longest possible match, strips out last 12 characters  abcd12345abc6789
#                                    ^^^^                 |-------------|

# Remember, # and ## work from the left end (beginning) of string,
#           % and %% work from the right end.

echo

exit 0

स्रोत पैरामीटर प्रतिस्थापन


मोडुलो संचालक

%

modulo, या mod (पूर्णांक विभाजन ऑपरेशन के शेष को लौटाता है)

bash$ expr 5 % 3
2

5/3 = 1, शेष 2 के साथ

स्रोत संचालक


शायद मुझे यह मिल गया: यह चीजों के लिए है .*और %इसे गैर-लालची होने के लिए परिभाषित करता है जबकि %%यह लालची बनाता है? तो वास्तव में नाम बदलने के उदाहरण में यह कोई फर्क नहीं पड़ता कि क्या उपयोग करना है %या %%लेकिन अगर यह था mv "$file" "${file%.*png.jpg}.jpg"(नोट *) तो %% का उपयोग करके सभी फाइलों को सिर्फ .jpgसही नाम दिया जाएगा ?
थॉमस वेलर

@ थोमसवेलर मुझे लगता है कि यह सही है। लेकिन मैं कोई बैश विशेषज्ञ नहीं हूं।
DavidPostill

यह कहना कि "निकालें ... सबसे छोटा हिस्सा $Patternगलत है क्योंकि चर $Patternको उदाहरण में परिभाषित नहीं किया गया है, केवल पाठ" पैटर्न "को $varकरते समय ${var%Pattern}या हटाया जा रहा है ${var%%Pattern}। शायद यह केवल एक टाइपो है, लेकिन यह अभी तक tldp.org का एक और उदाहरण गलत है। बैशगाइड या बैश हैकर्स विकी दोनों ही बेहतर संदर्भ हैं।
जॉन बी

@ जॉन बी धन्यवाद। दोनों लिंक बुकमार्क किए गए। मैंने उत्तर में पाठ सही किया है।
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.