Introduktion:
Når du arbejder med filer i Bash, skal du måske ofte adskille filnavnet fra dets udvidelse. En almindelig tilgang bruger kommandoen `cut`, men denne metode kan mislykkes med filnavne, der indeholder flere punktum.
For eksempel ville et filnavn som `a.b.js` blive opdelt forkert i `a` og `b.js` i stedet for `a.b` og `js`. Selvom Python giver en nem løsning med `os.path.splitext()`, er det måske ikke altid den mest effektive mulighed at bruge Python. Denne artikel udforsker bedre metoder til at opnå denne opgave i Bash.
Kommando | Beskrivelse |
---|---|
${variable%.*} | Parameterudvidelse for at fjerne udvidelsen fra et filnavn. |
${variable##*.} | Parameterudvidelse for at udtrække udvidelsen fra et filnavn. |
awk -F. | Indstiller feltseparatoren til et punktum, der bruges til at opdele filnavnet. |
OFS="." | Outputfeltseparator i awk, bruges til at rekonstruere filnavnet uden filtypenavn. |
NF-- | Reducerer antallet af felter med et i awk, hvilket effektivt fjerner udvidelsen. |
${BASH_REMATCH} | Array, der holder matchene fra et regulært udtryk i Bash. |
local variable | Erklærer en variabel med lokalt omfang inden for en funktion i Bash. |
Detaljeret opdeling af Bash-løsninger
De leverede scripts tilbyder forskellige metoder til at adskille et filnavn og dets udvidelse i Bash. Det første script bruger Bash-parameterudvidelse. Variablen ${FILE%.*} fjerner forlængelsen ved at strippe alt fra sidste periode til slutningen af strengen, mens ${FILE##*.} fanger forlængelsen ved at tage alt efter sidste menstruation. Denne metode er ligetil og effektiv for de fleste filnavnestrukturer. Det andet script bruger awk, et kraftfuldt tekstbehandlingsværktøj i Unix-lignende miljøer. Ved at indstille feltseparatoren til en periode vha -F., giver det mulighed for at opdele filnavnet i dele. Udgangsfeltseparatoren, OFS=".", og reducere antallet af felter med NF-- er teknikker til at samle filnavnet igen uden dets udvidelse.
Det tredje script anvender regulære udtryk i Bash, der udnytter ${BASH_REMATCH} at fange grupper i et regex-match. Dette script bruger et mønster, der deler filnavnet i to grupper: en for basisnavnet og en for udvidelsen. Endelig indkapsler det brugerdefinerede funktionsscript parameterudvidelseslogikken i en funktion, hvilket forbedrer kodegenanvendelighed og læsbarhed. Det bruger local variable erklæringer for at holde variabler omfattet af funktionen, hvilket forhindrer utilsigtede bivirkninger i større scripts. Hver metode demonstrerer en anden tilgang til at løse det samme problem, og viser alsidigheden og kraften i Bash-scripting.
Brug af parameterudvidelse i Bash
Bash scripting
#!/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"
Brug af Awk til at adskille filnavn og udvidelse
Bash med 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"
Brug af regulære udtryk i Bash
Bash scripting med regex
#!/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"
Brug af en brugerdefineret funktion i Bash
Bash scripting med brugerdefineret funktion
#!/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"
Udforskning af alternative metoder til filmanipulation i Bash
Ud over de allerede diskuterede metoder er der andre nyttige teknikker i Bash til at manipulere filnavne og udvidelser. En sådan metode involverer at bruge basename og dirname kommandoer. basename kan bruges til at udtrække filnavnet fra en sti, mens dirname henter mappestien. Kombination af disse kommandoer med parameterudvidelse kan effektivt adskille filnavne og udvidelser. For eksempel ved at bruge basename "$FILE" ".${FILE##*.}" fjerner udvidelsen fra filnavnet. Denne tilgang er især nyttig, når du arbejder med fulde filstier i stedet for blot filnavne.
En anden metode involverer at bruge sed, en kraftfuld stream-editor til filtrering og transformation af tekst. Ved at lave passende regulære udtryk, sed kan isolere filnavnet og filtypenavnet. For eksempel kommandoen echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' opdeler filnavnet og filtypenavnet og placerer dem i separate optagelsesgrupper. Denne teknik er fleksibel og kan håndtere komplekse filnavnestrukturer. Udforskning af disse yderligere værktøjer og metoder udvider din evne til at manipulere fildata i Bash, hvilket giver robuste løsninger til forskellige scriptscenarier.
Ofte stillede spørgsmål om Bash-filmanipulation
- Hvad er formålet med ${FILE%.*} kommando?
- Det fjerner udvidelsen fra filnavnet ved at fjerne alt efter den sidste punktum.
- Hvordan virker ${FILE##*.} kommando arbejde?
- Den udpakker udvidelsen ved at tage alt efter den sidste punktum i filnavnet.
- Hvad gør awk -F. gøre i det medfølgende script?
- Den indstiller feltseparatoren til en periode, så filnavnet kan opdeles i dele.
- Hvorfor bruge NF-- i en awk manuskript?
- Det reducerer antallet af felter med et, hvilket effektivt fjerner udvidelsen fra filnavnet.
- Hvordan hjælper regulære udtryk med at udtrække filnavn og filtypenavn?
- De giver mulighed for mønstermatching og gruppering, hvilket kan isolere forskellige dele af filnavnet.
- Hvad er fordelen ved at bruge en brugerdefineret funktion i Bash?
- En brugerdefineret funktion forbedrer kodegenanvendelighed og læsbarhed, hvilket gør scripts mere modulære.
- Hvordan gør basename hjælp til filnavne?
- Det udtrækker filnavnet fra en fuld filsti og fjerner eventuelt udvidelsen.
- Kan sed bruges til filnavnsmanipulation?
- Ja, sed kan bruge regulære udtryk til at transformere og isolere dele af filnavne.
Indpakning af løsningerne til udtræk af filnavn og udvidelse
Som konklusion kan udtrækning af filnavne og filtypenavne i Bash effektivt opnås gennem forskellige metoder, som hver passer til forskellige behov og præferencer. Uanset om du bruger parameterudvidelse, awk, sed eller brugerdefinerede funktioner, tilbyder disse teknikker fleksible og effektive løsninger. Forståelse og brug af disse kommandoer sikrer, at scripts kan håndtere filnavne med flere punktum og andre kompleksiteter uden fejl.