ആമുഖം:
Bash-ലെ ഫയലുകളിൽ പ്രവർത്തിക്കുമ്പോൾ, ഫയൽനാമം അതിൻ്റെ വിപുലീകരണത്തിൽ നിന്ന് വേർതിരിക്കേണ്ടതായി വന്നേക്കാം. ഒരു സാധാരണ സമീപനം `കട്ട്` കമാൻഡ് ഉപയോഗിക്കുന്നു, എന്നാൽ ഒന്നിലധികം കാലയളവുകൾ അടങ്ങിയ ഫയൽനാമങ്ങളിൽ ഈ രീതി പരാജയപ്പെടാം.
ഉദാഹരണത്തിന്, `a.b.js` പോലെയുള്ള ഒരു ഫയൽനാമം `a.b`, `js` എന്നിവയ്ക്ക് പകരം `a`, `b.js` എന്നിങ്ങനെ തെറ്റായി വിഭജിക്കപ്പെടും. `os.path.splitext()` ഉപയോഗിച്ച് പൈത്തൺ ഒരു എളുപ്പ പരിഹാരം നൽകുന്നുണ്ടെങ്കിലും, പൈത്തൺ ഉപയോഗിക്കുന്നത് എല്ലായ്പ്പോഴും ഏറ്റവും കാര്യക്ഷമമായ ഓപ്ഷൻ ആയിരിക്കണമെന്നില്ല. ബാഷിൽ ഈ ടാസ്ക് നേടുന്നതിനുള്ള മികച്ച രീതികൾ ഈ ലേഖനം പര്യവേക്ഷണം ചെയ്യുന്നു.
കമാൻഡ് | വിവരണം |
---|---|
${variable%.*} | ഒരു ഫയൽ നാമത്തിൽ നിന്ന് വിപുലീകരണം നീക്കം ചെയ്യുന്നതിനുള്ള പാരാമീറ്റർ വിപുലീകരണം. |
${variable##*.} | ഒരു ഫയൽ നാമത്തിൽ നിന്ന് വിപുലീകരണം എക്സ്ട്രാക്റ്റുചെയ്യുന്നതിനുള്ള പാരാമീറ്റർ വിപുലീകരണം. |
awk -F. | ഫയലിൻ്റെ പേര് വിഭജിക്കാൻ ഉപയോഗിക്കുന്ന ഒരു കാലയളവിലേക്ക് ഫീൽഡ് സെപ്പറേറ്ററിനെ സജ്ജമാക്കുന്നു. |
OFS="." | awk-ലെ ഔട്ട്പുട്ട് ഫീൽഡ് സെപ്പറേറ്റർ, വിപുലീകരണമില്ലാതെ ഫയലിൻ്റെ പേര് പുനർനിർമ്മിക്കാൻ ഉപയോഗിക്കുന്നു. |
NF-- | awk-ൽ ഫീൽഡുകളുടെ എണ്ണം ഒന്നായി കുറയ്ക്കുന്നു, വിപുലീകരണം ഫലപ്രദമായി നീക്കം ചെയ്യുന്നു. |
${BASH_REMATCH} | ബാഷിലെ ഒരു സാധാരണ എക്സ്പ്രഷനിൽ നിന്ന് പൊരുത്തങ്ങൾ സൂക്ഷിക്കുന്ന അറേ. |
local variable | ബാഷിലെ ഒരു ഫംഗ്ഷനിൽ ലോക്കൽ സ്കോപ്പുള്ള ഒരു വേരിയബിൾ പ്രഖ്യാപിക്കുന്നു. |
ബാഷ് സൊല്യൂഷനുകളുടെ വിശദമായ തകർച്ച
നൽകിയിരിക്കുന്ന സ്ക്രിപ്റ്റുകൾ ഒരു ഫയലിൻ്റെ പേരും അതിൻ്റെ വിപുലീകരണവും വേർതിരിക്കുന്നതിനുള്ള വിവിധ രീതികൾ ബാഷിൽ വാഗ്ദാനം ചെയ്യുന്നു. ആദ്യ സ്ക്രിപ്റ്റ് ബാഷ് പാരാമീറ്റർ വിപുലീകരണം ഉപയോഗിക്കുന്നു. വേരിയബിൾ ${FILE%.*} അവസാന പിരീഡ് മുതൽ സ്ട്രിംഗിൻ്റെ അവസാനം വരെയുള്ള എല്ലാം നീക്കം ചെയ്തുകൊണ്ട് വിപുലീകരണം നീക്കം ചെയ്യുന്നു ${FILE##*.} അവസാന പിരീഡിന് ശേഷം എല്ലാം എടുത്ത് വിപുലീകരണം ക്യാപ്ചർ ചെയ്യുന്നു. മിക്ക ഫയൽനാമ ഘടനകൾക്കും ഈ രീതി ലളിതവും കാര്യക്ഷമവുമാണ്. രണ്ടാമത്തെ സ്ക്രിപ്റ്റ് ഉപയോഗിക്കുന്നു awk, Unix പോലുള്ള പരിതസ്ഥിതികളിൽ ശക്തമായ ടെക്സ്റ്റ് പ്രോസസ്സിംഗ് ടൂൾ. ഉപയോഗിക്കുന്ന ഒരു കാലയളവിലേക്ക് ഫീൽഡ് സെപ്പറേറ്റർ സജ്ജീകരിക്കുന്നതിലൂടെ -F., ഫയലിൻ്റെ പേര് ഭാഗങ്ങളായി വിഭജിക്കാൻ ഇത് അനുവദിക്കുന്നു. ഔട്ട്പുട്ട് ഫീൽഡ് സെപ്പറേറ്റർ, OFS=".", കൂടാതെ ഫീൽഡുകളുടെ എണ്ണം കുറയ്ക്കുന്നു NF-- ഫയലിൻ്റെ പേര് അതിൻ്റെ വിപുലീകരണമില്ലാതെ വീണ്ടും കൂട്ടിച്ചേർക്കുന്നതിനുള്ള സാങ്കേതികതകളാണ്.
മൂന്നാമത്തെ സ്ക്രിപ്റ്റ് ബാഷിൽ പതിവ് പദപ്രയോഗങ്ങൾ ഉപയോഗിക്കുന്നു, അത് പ്രയോജനപ്പെടുത്തുന്നു ${BASH_REMATCH} ഒരു റീജക്സ് മത്സരത്തിൽ ഗ്രൂപ്പുകൾ പിടിച്ചെടുക്കാൻ. ഈ സ്ക്രിപ്റ്റ് ഫയലിൻ്റെ പേര് രണ്ട് ഗ്രൂപ്പുകളായി വിഭജിക്കുന്ന ഒരു പാറ്റേൺ ഉപയോഗിക്കുന്നു: ഒന്ന് അടിസ്ഥാന നാമത്തിനും ഒന്ന് വിപുലീകരണത്തിനും. അവസാനമായി, ഇഷ്ടാനുസൃത ഫംഗ്ഷൻ സ്ക്രിപ്റ്റ് ഒരു ഫംഗ്ഷനിൽ പരാമീറ്റർ വിപുലീകരണ ലോജിക് ഉൾക്കൊള്ളുന്നു, ഇത് കോഡ് പുനരുപയോഗക്ഷമതയും വായനാക്ഷമതയും വർദ്ധിപ്പിക്കുന്നു. അത് ഉപയോഗിക്കുന്നു local variable ഫംഗ്ഷനിൽ വേരിയബിളുകൾ സ്കോപ്പ് ചെയ്ത് സൂക്ഷിക്കുന്നതിനുള്ള പ്രഖ്യാപനങ്ങൾ, വലിയ സ്ക്രിപ്റ്റുകളിൽ ഉദ്ദേശിക്കാത്ത പാർശ്വഫലങ്ങൾ തടയുന്നു. ഓരോ രീതിയും ഒരേ പ്രശ്നം പരിഹരിക്കുന്നതിനുള്ള വ്യത്യസ്ത സമീപനം പ്രകടിപ്പിക്കുന്നു, ബാഷ് സ്ക്രിപ്റ്റിംഗിൻ്റെ വൈവിധ്യവും ശക്തിയും കാണിക്കുന്നു.
ബാഷിൽ പാരാമീറ്റർ വിപുലീകരണം ഉപയോഗിക്കുന്നു
ബാഷ് സ്ക്രിപ്റ്റിംഗ്
#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
ഫയലിൻ്റെ പേരും വിപുലീകരണവും വേർതിരിക്കാൻ Awk ഉപയോഗിക്കുന്നു
Awk ഉപയോഗിച്ച് ബാഷ് ചെയ്യുക
#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
ബാഷിൽ റെഗുലർ എക്സ്പ്രഷനുകൾ ഉപയോഗിക്കുന്നു
റീജക്സിനൊപ്പം ബാഷ് സ്ക്രിപ്റ്റിംഗ്
#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
ബാഷിൽ ഒരു കസ്റ്റം ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു
ഇഷ്ടാനുസൃത പ്രവർത്തനത്തോടുകൂടിയ ബാഷ് സ്ക്രിപ്റ്റിംഗ്
#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
local file="$1"
echo "Filename: ${file%.*}"
echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"
ബാഷിലെ ഫയൽ കൃത്രിമത്വത്തിനുള്ള ഇതര രീതികൾ പര്യവേക്ഷണം ചെയ്യുന്നു
ഇതിനകം ചർച്ച ചെയ്ത രീതികൾക്കപ്പുറം, ഫയൽനാമങ്ങളും വിപുലീകരണങ്ങളും കൈകാര്യം ചെയ്യുന്നതിനുള്ള മറ്റ് ഉപയോഗപ്രദമായ സാങ്കേതിക വിദ്യകൾ ബാഷിൽ ഉണ്ട്. അത്തരം ഒരു രീതി ഉപയോഗിക്കുന്നത് ഉൾപ്പെടുന്നു basename ഒപ്പം dirname കമാൻഡുകൾ. basename ഒരു പാത്തിൽ നിന്ന് ഫയലിൻ്റെ പേര് എക്സ്ട്രാക്റ്റുചെയ്യാൻ ഉപയോഗിക്കാം dirname ഡയറക്ടറി പാത്ത് വീണ്ടെടുക്കുന്നു. ഈ കമാൻഡുകൾ പാരാമീറ്റർ വിപുലീകരണവുമായി സംയോജിപ്പിക്കുന്നത് ഫയൽനാമങ്ങളും വിപുലീകരണങ്ങളും ഫലപ്രദമായി വേർതിരിക്കാനാകും. ഉദാഹരണത്തിന്, ഉപയോഗിക്കുന്നത് basename "$FILE" ".${FILE##*.}" ഫയൽ നാമത്തിൽ നിന്ന് വിപുലീകരണം നീക്കം ചെയ്യുന്നു. ഫയൽനാമങ്ങൾക്കുപകരം പൂർണ്ണ ഫയൽ പാതകളിൽ പ്രവർത്തിക്കുമ്പോൾ ഈ സമീപനം പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാണ്.
മറ്റൊരു രീതി ഉപയോഗിക്കുന്നത് ഉൾപ്പെടുന്നു sed, വാചകം ഫിൽട്ടർ ചെയ്യുന്നതിനും രൂപാന്തരപ്പെടുത്തുന്നതിനുമുള്ള ശക്തമായ സ്ട്രീം എഡിറ്റർ. ഉചിതമായ പതിവ് പദപ്രയോഗങ്ങൾ രൂപപ്പെടുത്തുന്നതിലൂടെ, sed ഫയലിൻ്റെ പേരും വിപുലീകരണവും ഒറ്റപ്പെടുത്താൻ കഴിയും. ഉദാഹരണത്തിന്, കമാൻഡ് echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' ഫയലിൻ്റെ പേരും വിപുലീകരണവും വിഭജിച്ച് അവയെ പ്രത്യേക ക്യാപ്ചർ ഗ്രൂപ്പുകളിൽ സ്ഥാപിക്കുന്നു. ഈ സാങ്കേതികത വഴക്കമുള്ളതും സങ്കീർണ്ണമായ ഫയൽനാമ ഘടനകൾ കൈകാര്യം ചെയ്യാൻ കഴിയുന്നതുമാണ്. ഈ അധിക ടൂളുകളും രീതികളും പര്യവേക്ഷണം ചെയ്യുന്നത് ബാഷിൽ ഫയൽ ഡാറ്റ കൈകാര്യം ചെയ്യാനുള്ള നിങ്ങളുടെ കഴിവ് വിപുലീകരിക്കുന്നു, വിവിധ സ്ക്രിപ്റ്റിംഗ് സാഹചര്യങ്ങൾക്ക് ശക്തമായ പരിഹാരങ്ങൾ നൽകുന്നു.
ബാഷ് ഫയൽ കൃത്രിമത്വത്തെക്കുറിച്ചുള്ള പതിവ് ചോദ്യങ്ങൾ
- എന്താണ് ഉദ്ദേശ്യം ${FILE%.*} കൽപ്പന?
- അവസാന കാലയളവിനുശേഷം എല്ലാം നീക്കം ചെയ്തുകൊണ്ട് ഇത് ഫയലിൻ്റെ പേരിൽ നിന്ന് വിപുലീകരണം നീക്കംചെയ്യുന്നു.
- എങ്ങനെ ചെയ്യുന്നു ${FILE##*.} കമാൻഡ് വർക്ക്?
- ഫയൽ നാമത്തിലെ അവസാന കാലയളവിനുശേഷം എല്ലാം എടുത്ത് ഇത് വിപുലീകരണം എക്സ്ട്രാക്റ്റുചെയ്യുന്നു.
- എന്താണ് ചെയ്യുന്നത് awk -F. നൽകിയിരിക്കുന്ന സ്ക്രിപ്റ്റിൽ ചെയ്യണോ?
- ഇത് ഫീൽഡ് സെപ്പറേറ്ററിനെ ഒരു കാലയളവിലേക്ക് സജ്ജമാക്കുന്നു, ഫയലിൻ്റെ പേര് ഭാഗങ്ങളായി വിഭജിക്കാൻ അനുവദിക്കുന്നു.
- എന്തിനാണ് ഉപയോഗിക്കുന്നത് NF-- ഒരു ൽ awk സ്ക്രിപ്റ്റ്?
- ഇത് ഫീൽഡുകളുടെ എണ്ണം ഒന്നായി കുറയ്ക്കുന്നു, ഫയൽ നാമത്തിൽ നിന്ന് വിപുലീകരണം ഫലപ്രദമായി നീക്കംചെയ്യുന്നു.
- ഫയലിൻ്റെ പേരും വിപുലീകരണവും എക്സ്ട്രാക്റ്റുചെയ്യുന്നതിന് സാധാരണ എക്സ്പ്രഷനുകൾ എങ്ങനെ സഹായിക്കുന്നു?
- പാറ്റേൺ പൊരുത്തപ്പെടുത്തലിനും ഗ്രൂപ്പിംഗിനും അവ അനുവദിക്കുന്നു, ഇത് ഫയലിൻ്റെ വിവിധ ഭാഗങ്ങൾ വേർതിരിച്ചെടുക്കാൻ കഴിയും.
- ബാഷിൽ ഒരു ഇഷ്ടാനുസൃത ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നതിൻ്റെ പ്രയോജനം എന്താണ്?
- ഒരു ഇഷ്ടാനുസൃത ഫംഗ്ഷൻ കോഡ് പുനരുപയോഗക്ഷമതയും വായനാക്ഷമതയും വർദ്ധിപ്പിക്കുന്നു, സ്ക്രിപ്റ്റുകളെ കൂടുതൽ മോഡുലാർ ആക്കുന്നു.
- എങ്ങിനെയാണ് basename ഫയൽനാമങ്ങളിൽ സഹായിക്കണോ?
- ഇത് ഒരു പൂർണ്ണ ഫയൽ പാതയിൽ നിന്ന് ഫയലിൻ്റെ പേര് എക്സ്ട്രാക്റ്റുചെയ്യുന്നു, ഓപ്ഷണലായി വിപുലീകരണം നീക്കം ചെയ്യുന്നു.
- കഴിയും sed ഫയൽനാമം കൃത്രിമമാക്കാൻ ഉപയോഗിക്കണോ?
- അതെ, sed ഫയൽനാമങ്ങളുടെ ഭാഗങ്ങൾ രൂപാന്തരപ്പെടുത്തുന്നതിനും ഒറ്റപ്പെടുത്തുന്നതിനും പതിവ് എക്സ്പ്രഷനുകൾ ഉപയോഗിക്കാം.
ഫയലിൻ്റെ പേരിനും വിപുലീകരണ എക്സ്ട്രാക്ഷനുമുള്ള പരിഹാരങ്ങൾ പൊതിയുന്നു
ഉപസംഹാരമായി, ബാഷിൽ ഫയൽനാമങ്ങളും വിപുലീകരണങ്ങളും എക്സ്ട്രാക്റ്റുചെയ്യുന്നത് വിവിധ രീതികളിലൂടെ ഫലപ്രദമായി നേടാനാകും, ഓരോന്നും വ്യത്യസ്ത ആവശ്യങ്ങൾക്കും മുൻഗണനകൾക്കും അനുയോജ്യമാണ്. പാരാമീറ്റർ വിപുലീകരണം, awk, sed, അല്ലെങ്കിൽ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ എന്നിവ ഉപയോഗിച്ചാലും, ഈ സാങ്കേതിക വിദ്യകൾ വഴക്കമുള്ളതും കാര്യക്ഷമവുമായ പരിഹാരങ്ങൾ വാഗ്ദാനം ചെയ്യുന്നു. ഈ കമാൻഡുകൾ മനസ്സിലാക്കുകയും ഉപയോഗിക്കുകയും ചെയ്യുന്നത്, സ്ക്രിപ്റ്റുകൾക്ക് ഒന്നിലധികം കാലഘട്ടങ്ങളും മറ്റ് സങ്കീർണതകളുമുള്ള ഫയൽനാമങ്ങൾ പിശകില്ലാതെ കൈകാര്യം ചെയ്യാൻ കഴിയുമെന്ന് ഉറപ്പാക്കുന്നു.