बैश - निरंतर स्ट्रिंग हेरफेर


11
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

वहाँ वैसे भी इन दो लाइनों को एक साथ एक लाइनर में गोंद करने के लिए है?

जवाबों:


12

FILE=$(basename "${1/%.jpeg/.jpg}") मेरे लिए काम किया।

परीक्षा:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

स्क्रिप्ट सामग्री:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"

चूंकि दो लाइनें थोड़े इंटरचेंजेबल हैं, इसलिए यह समाधान अब तक सबसे साफ है ... अगर लाइन्स को विनिमेय नहीं किया जाता है sed, तो निश्चित रूप से इस अनुमान की आवश्यकता होगी।
gsklee

11

आप बश में विस्तार नहीं कर सकते हैं (न ही ksh, राख और zsh के अलावा अन्य गोले में)। यह केवल एक कॉस्मेटिक सीमा है, जैसा कि आप स्पष्ट करते हैं कि आप एक अस्थायी चर के लिए एक मध्यवर्ती अभिव्यक्ति प्रदान कर सकते हैं। यह वन-लाइनर्स के लिए थोड़ा कष्टप्रद है, लेकिन स्क्रिप्ट में यह पठनीयता के लिए यकीनन बेहतर है।

आप बाहरी उपयोगिता का उपयोग करने से बच सकते हैं basenameऔर इसके बजाय एक स्ट्रिंग हेरफेर निर्माण का उपयोग कर सकते हैं:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

यहां, ऐसा होता है कि आप अपनी स्क्रिप्ट को फिर से बाहर ले जाने के लिए कमांड की जगह ले सकते हैं । यह एक सामान्य घटना नहीं है, न ही आप एक निश्चित एक-लाइनर महसूस के अलावा कुछ भी हासिल नहीं करते हैं।

Zsh, बेहतर या बदतर के लिए, आपको घोंसले का विस्तार करने देता है:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

या आप इसके बजाय zsh के अंतर्निहित निर्माण का उपयोग कर सकते हैं basename:

FILE=${${1:t}/%.jpeg/.jpg}

4

मैं इसके लिए जाऊंगा:

FILE=$(basename $1 .jpeg).jpg

बेसनेम का दूसरा पैरामीटर फ़ाइल नाम से हटाया जाने वाला एक प्रत्यय है (देखें man basename)


3

आप sedनिम्न के रूप में एक ही आदेश का उपयोग कर सकते हैं :

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

निगमित sed, यह करना चाहिए चाल:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(यह बिल्कुल आपके प्रश्न का उत्तर नहीं देता है क्योंकि मैं नहीं कर सकता; यकीन है कि अगर यह संभव नहीं है।)


1

बैश वैरिएबल नामों के${} साथ काम करता है , इसलिए सीधे कमांड एम्बेड करने का कोई तरीका नहीं है। @ sr_ का दृष्टिकोण एक विकल्प है यदि आप अतिरिक्त कांटा को बुरा नहीं मानते हैं।


1

रेखा

FILE=$(basename "${1/%.jpeg/.jpg}")

के साथ छोटा किया जा सकता है और अधिक पोर्टेबल बनाया जा सकता है

FILE=$(basename "${1%.jpeg}.jpg")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.