Hvordan skille filnavn og utvidelse i Bash

Hvordan skille filnavn og utvidelse i Bash
Hvordan skille filnavn og utvidelse i Bash

Introduksjon:

Når du arbeider med filer i Bash, kan det hende du ofte må skille filnavnet fra filtypen. En vanlig tilnærming bruker "cut"-kommandoen, men denne metoden kan mislykkes med filnavn som inneholder flere punktum.

For eksempel vil et filnavn som `a.b.js` være feil delt inn i `a` og `b.js` i stedet for `a.b` og `js`. Selv om Python gir en enkel løsning med `os.path.splitext()`, er det kanskje ikke alltid det mest effektive alternativet å bruke Python. Denne artikkelen utforsker bedre metoder for å oppnå denne oppgaven i Bash.

Kommando Beskrivelse
${variable%.*} Parameterutvidelse for å fjerne utvidelsen fra et filnavn.
${variable##*.} Parameterutvidelse for å trekke ut utvidelsen fra et filnavn.
awk -F. Setter feltskilleren til et punktum som brukes til å dele filnavnet.
OFS="." Utdatafeltseparator i awk, brukt til å rekonstruere filnavnet uten utvidelse.
NF-- Reduserer antall felt med ett i awk, og fjerner effektivt utvidelsen.
${BASH_REMATCH} Array som inneholder treffene fra et regulært uttrykk i Bash.
local variable Erklærer en variabel med lokalt omfang innenfor en funksjon i Bash.

Detaljert oversikt over Bash-løsninger

Skriptene som tilbys tilbyr ulike metoder for å skille et filnavn og dets utvidelse i Bash. Det første skriptet bruker Bash-parameterutvidelse. Variabelen ${FILE%.*} fjerner forlengelsen ved å strippe alt fra siste periode til slutten av strengen, mens ${FILE##*.} fanger opp forlengelsen ved å ta alt etter siste periode. Denne metoden er enkel og effektiv for de fleste filnavnstrukturer. Det andre skriptet bruker awk, et kraftig tekstbehandlingsverktøy i Unix-lignende miljøer. Ved å sette feltskilleren til en periode ved hjelp av -F., tillater det å dele filnavnet i deler. Utdatafeltseparatoren, OFS=".", og redusere antall felt med NF-- er teknikker for å sette sammen filnavnet på nytt uten utvidelse.

Det tredje skriptet bruker regulære uttrykk i Bash, utnytter ${BASH_REMATCH} for å fange grupper i en regex-match. Dette skriptet bruker et mønster som deler filnavnet i to grupper: en for basisnavnet og en for utvidelsen. Til slutt innkapsler det tilpassede funksjonsskriptet parameterutvidelseslogikken i en funksjon, og forbedrer kodens gjenbrukbarhet og lesbarhet. Det bruker local variable erklæringer for å holde variabler innenfor funksjonen, og forhindre utilsiktede bivirkninger i større skript. Hver metode viser en annen tilnærming til å løse det samme problemet, og viser allsidigheten og kraften til Bash-skripting.

Bruke parameterutvidelse i Bash

Bash-skripting

#!/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"

Bruke Awk for å skille filnavn og utvidelse

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"

Bruke regulære uttrykk i Bash

Bash-skripting 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"

Bruke en egendefinert funksjon i Bash

Bash-skripting med tilpasset funksjon

#!/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"

Utforsker alternative metoder for filmanipulering i Bash

Utover metodene som allerede er diskutert, er det andre nyttige teknikker i Bash for å manipulere filnavn og utvidelser. En slik metode innebærer å bruke basename og dirname kommandoer. basename kan brukes til å trekke ut filnavnet fra en bane, while dirname henter katalogbanen. Å kombinere disse kommandoene med parameterutvidelse kan effektivt skille filnavn og utvidelser. For eksempel å bruke basename "$FILE" ".${FILE##*.}" fjerner utvidelsen fra filnavnet. Denne tilnærmingen er spesielt nyttig når du arbeider med fullstendige filbaner i stedet for bare filnavn.

En annen metode innebærer å bruke 1. 3, en kraftig strømredigerer for filtrering og transformering av tekst. Ved å lage passende regulære uttrykk, 1. 3 kan isolere filnavnet og filtypen. For eksempel kommandoen echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' deler filnavnet og filtypen, og plasserer dem i separate fangstgrupper. Denne teknikken er fleksibel og kan håndtere komplekse filnavnstrukturer. Utforsking av disse tilleggsverktøyene og metodene utvider din evne til å manipulere fildata i Bash, og gir robuste løsninger for ulike skriptscenarier.

Ofte stilte spørsmål om Bash-filmanipulering

  1. Hva er hensikten med ${FILE%.*} kommando?
  2. Den fjerner utvidelsen fra filnavnet ved å fjerne alt etter siste punktum.
  3. Hvordan fungerer ${FILE##*.} kommandoarbeid?
  4. Den trekker ut utvidelsen ved å ta alt etter siste punktum i filnavnet.
  5. Hva gjør awk -F. gjøre i det medfølgende skriptet?
  6. Den setter feltseparatoren til en periode, slik at filnavnet kan deles opp i deler.
  7. Hvorfor bruke NF-- i en awk manus?
  8. Det reduserer antall felt med ett, og fjerner effektivt utvidelsen fra filnavnet.
  9. Hvordan hjelper regulære uttrykk med å trekke ut filnavn og filtype?
  10. De tillater mønstertilpasning og gruppering, som kan isolere forskjellige deler av filnavnet.
  11. Hva er fordelen med å bruke en tilpasset funksjon i Bash?
  12. En tilpasset funksjon forbedrer kodegjenbrukbarhet og lesbarhet, og gjør skript mer modulære.
  13. Hvordan gjør basename hjelp med filnavn?
  14. Den trekker ut filnavnet fra en fullstendig filbane, eventuelt fjerner utvidelsen.
  15. Kan 1. 3 brukes til filnavnmanipulering?
  16. Ja, 1. 3 kan bruke regulære uttrykk for å transformere og isolere deler av filnavn.

Avslutte løsningene for utvinning av filnavn og utvidelse

Avslutningsvis kan utpakking av filnavn og utvidelser i Bash oppnås effektivt gjennom ulike metoder, hver tilpasset ulike behov og preferanser. Enten du bruker parameterutvidelse, awk, sed eller tilpassede funksjoner, tilbyr disse teknikkene fleksible og effektive løsninger. Å forstå og bruke disse kommandoene sikrer at skript kan håndtere filnavn med flere punktum og annen kompleksitet uten feil.