Hur man separerar filnamn och filtillägg i Bash

Hur man separerar filnamn och filtillägg i Bash
Hur man separerar filnamn och filtillägg i Bash

Introduktion:

När du arbetar med filer i Bash kan du ofta behöva separera filnamnet från dess tillägg. Ett vanligt tillvägagångssätt använder kommandot `cut`, men den här metoden kan misslyckas med filnamn som innehåller flera punkter.

Till exempel skulle ett filnamn som "a.b.js" felaktigt delas upp i "a" och "b.js" istället för "a.b" och "js". Även om Python tillhandahåller en enkel lösning med `os.path.splitext()`, är det kanske inte alltid det mest effektiva alternativet att använda Python. Den här artikeln utforskar bättre metoder för att uppnå denna uppgift i Bash.

Kommando Beskrivning
${variable%.*} Parameterexpansion för att ta bort tillägget från ett filnamn.
${variable##*.} Parameterexpansion för att extrahera tillägget från ett filnamn.
awk -F. Ställer in fältavgränsaren till en punkt, som används för att dela filnamnet.
OFS="." Utdatafältseparator i awk, används för att rekonstruera filnamnet utan förlängning.
NF-- Minskar antalet fält med ett i awk, vilket effektivt tar bort tillägget.
${BASH_REMATCH} Array som innehåller matchningarna från ett reguljärt uttryck i Bash.
local variable Deklarerar en variabel med lokalt omfång inom en funktion i Bash.

Detaljerad uppdelning av Bash Solutions

Skripten som tillhandahålls erbjuder olika metoder för att separera ett filnamn och dess tillägg i Bash. Det första skriptet använder Bash-parameterexpansion. Variabeln ${FILE%.*} tar bort förlängningen genom att ta bort allt från sista perioden till slutet av strängen, medan ${FILE##*.} fångar förlängningen genom att ta allt efter sista perioden. Denna metod är enkel och effektiv för de flesta filnamnsstrukturer. Det andra skriptet använder awk, ett kraftfullt textbearbetningsverktyg i Unix-liknande miljöer. Genom att ställa in fältavgränsaren till en period med hjälp av -F., tillåter det att dela upp filnamnet i delar. Utdatafältseparatorn, OFS=".", och minska antalet fält med NF-- är tekniker för att återsätta filnamnet utan dess tillägg.

Det tredje skriptet använder reguljära uttryck i Bash, utnyttjande ${BASH_REMATCH} för att fånga grupper i en regex-matchning. Det här skriptet använder ett mönster som delar upp filnamnet i två grupper: en för basnamnet och en för tillägget. Slutligen kapslar det anpassade funktionsskriptet in parameterexpansionslogiken i en funktion, vilket förbättrar kodåteranvändbarhet och läsbarhet. Det använder local variable deklarationer för att hålla variabler omfångade inom funktionen, vilket förhindrar oavsiktliga bieffekter i större skript. Varje metod visar olika metoder för att lösa samma problem, och visar mångsidigheten och kraften i Bash-skript.

Använda parameterexpansion 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"

Använda Awk för att separera filnamn och tillägg

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"

Använda reguljära uttryck i Bash

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

Använda en anpassad funktion i Bash

Bash scripting med anpassad 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"

Utforska alternativa metoder för filhantering i Bash

Utöver de metoder som redan diskuterats, finns det andra användbara tekniker i Bash för att manipulera filnamn och tillägg. En sådan metod innebär att använda basename och dirname kommandon. basename kan användas för att extrahera filnamnet från en sökväg, while dirname hämtar katalogsökvägen. Att kombinera dessa kommandon med parameterexpansion kan effektivt separera filnamn och tillägg. Till exempel att använda basename "$FILE" ".${FILE##*.}" tar bort tillägget från filnamnet. Detta tillvägagångssätt är särskilt användbart när du arbetar med fullständiga filsökvägar snarare än bara filnamn.

En annan metod innebär att använda sed, en kraftfull strömredigerare för filtrering och omvandling av text. Genom att skapa lämpliga reguljära uttryck, sed kan isolera filnamnet och filtillägget. Till exempel kommandot echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' delar upp filnamnet och filtillägget och placerar dem i separata fångstgrupper. Denna teknik är flexibel och kan hantera komplexa filnamnsstrukturer. Att utforska dessa ytterligare verktyg och metoder utökar din förmåga att manipulera fildata i Bash, vilket ger robusta lösningar för olika skriptscenarier.

Vanliga frågor om Bash-filhantering

  1. Vad är syftet med ${FILE%.*} kommando?
  2. Den tar bort tillägget från filnamnet genom att ta bort allt efter den sista perioden.
  3. Hur gör det ${FILE##*.} kommandoarbete?
  4. Den extraherar tillägget genom att ta allt efter den sista punkten i filnamnet.
  5. Vad gör awk -F. göra i det medföljande skriptet?
  6. Den ställer in fältavgränsaren till en punkt, vilket gör att filnamnet kan delas upp i delar.
  7. Varför använda NF-- i en awk manus?
  8. Det minskar antalet fält med ett, vilket effektivt tar bort tillägget från filnamnet.
  9. Hur hjälper reguljära uttryck till att extrahera filnamn och filtillägg?
  10. De tillåter mönstermatchning och gruppering, vilket kan isolera olika delar av filnamnet.
  11. Vad är fördelen med att använda en anpassad funktion i Bash?
  12. En anpassad funktion förbättrar kodåteranvändbarhet och läsbarhet, vilket gör skript mer modulära.
  13. Hur gör basename hjälp med filnamn?
  14. Det extraherar filnamnet från en fullständig sökväg, eventuellt tar det bort tillägget.
  15. Burk sed användas för filnamnsmanipulation?
  16. Ja, sed kan använda reguljära uttryck för att transformera och isolera delar av filnamn.

Avsluta lösningarna för filnamns- och tilläggsextraktion

Sammanfattningsvis kan extrahera filnamn och tillägg i Bash effektivt uppnås genom olika metoder, var och en anpassad till olika behov och preferenser. Oavsett om du använder parameterexpansion, awk, sed eller anpassade funktioner, erbjuder dessa tekniker flexibla och effektiva lösningar. Att förstå och använda dessa kommandon säkerställer att skript kan hantera filnamn med flera punkter och andra komplexiteter utan fel.