मैं मामले पर विचार करते हुए फ़ाइल नाम के विस्तार को प्रतिस्थापित करने का प्रयास कर रहा हूं लेकिन सफलता के बिना।

#!/bin/bash
pdf_file="/root/users/test.pdf"
jpg_file="${pdf_file/.pdf/.jpg}"
echo $jpg_file

मैंने कोशिश की, लेकिन यह काम नहीं करता है:

jpg_file="${pdf_file/(.pdf|.PDF)/.jpg}"
1
Programador Desenvolvedor 4 सितंबर 2019, 23:14

1 उत्तर

सबसे बढ़िया उत्तर

आप इस तरह एक ग्लोब पैटर्न का उपयोग कर सकते हैं:

$ echo "${pdf_file/.[Pp][Dd][Ff]/.jpg}"
/root/users/test.jpg

यदि आप विस्तारित ग्लोब पैटर्न (shopt -s extglob) का उपयोग करते हैं, तो आप इसके बजाय इसका उपयोग कर सकते हैं:

$ echo "${pdf_file/.@(PDF|pdf)/.jpg}"
/root/users/test.jpg

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

$ shopt -s nocasematch
$ pdf_file="/root/users/test.PDF"
$ echo "${pdf_file/.pdf/.jpg}"
/root/users/test.jpg

रिमार्क सभी तीन समाधानों के लिए मान्य है: ${parameter/pattern/string} पैटर्न को जहां कहीं भी होता है उसे बदल देता है, लेकिन विस्तार की संभावना अंत में होती है - हम यह सुनिश्चित कर सकते हैं कि हम इसे केवल अंत में बदल देंगे:

echo "${pdf_file%.[Pp][Dd][Ff]}.jpg"

जो किसी भी POSIX शेल में काम करता है, या

shopt -s extglob
echo "${pdf_file%.@(PDF|pdf)}.jpg"

या

shopt -s nocasematch
pdf_file="/root/users/test.PDF"
echo "${pdf_file%.pdf}.jpg"
3
Benjamin W. 5 सितंबर 2019, 01:17