Bestandsnaam en extensie scheiden in Bash

Bestandsnaam en extensie scheiden in Bash
Bestandsnaam en extensie scheiden in Bash

Invoering:

Wanneer u met bestanden in Bash werkt, moet u mogelijk vaak de bestandsnaam scheiden van de extensie. Een gebruikelijke aanpak maakt gebruik van het `cut`-commando, maar deze methode kan mislukken als bestandsnamen meerdere punten bevatten.

Een bestandsnaam als `a.b.js` zou bijvoorbeeld ten onrechte worden opgesplitst in `a` en `b.js` in plaats van `a.b` en `js`. Hoewel Python een eenvoudige oplossing biedt met `os.path.splitext()`, is het gebruik van Python misschien niet altijd de meest efficiënte optie. Dit artikel onderzoekt betere methoden om deze taak in Bash te bereiken.

Commando Beschrijving
${variable%.*} Parameteruitbreiding om de extensie van een bestandsnaam te verwijderen.
${variable##*.} Parameteruitbreiding om de extensie uit een bestandsnaam te extraheren.
awk -F. Stelt het veldscheidingsteken in op een punt, die wordt gebruikt om de bestandsnaam te splitsen.
OFS="." Uitvoerveldscheidingsteken in awk, gebruikt om de bestandsnaam zonder extensie te reconstrueren.
NF-- Vermindert het aantal velden met één per awk, waardoor de extensie effectief wordt verwijderd.
${BASH_REMATCH} Array die de overeenkomsten van een reguliere expressie in Bash bevat.
local variable Declareert een variabele met lokaal bereik binnen een functie in Bash.

Gedetailleerd overzicht van Bash-oplossingen

De meegeleverde scripts bieden verschillende methoden voor het scheiden van een bestandsnaam en de extensie ervan in Bash. Het eerste script maakt gebruik van Bash-parameteruitbreiding. De variabele ${FILE%.*} verwijdert de extensie door alles van de laatste punt tot het einde van de string te verwijderen, while ${FILE##*.} legt de verlenging vast door alles na de laatste periode te nemen. Deze methode is eenvoudig en efficiënt voor de meeste bestandsnaamstructuren. Het tweede script maakt gebruik van awk, een krachtige tekstverwerkingstool in Unix-achtige omgevingen. Door het veldscheidingsteken in te stellen op een punt met behulp van -F., het maakt het mogelijk de bestandsnaam in delen te splitsen. Het uitvoerveldscheidingsteken, OFS=".", en het verminderen van het aantal velden met NF-- zijn technieken om de bestandsnaam opnieuw samen te stellen zonder de extensie.

Het derde script maakt gebruik van reguliere expressies in Bash, waarbij gebruik wordt gemaakt van ${BASH_REMATCH} om groepen vast te leggen in een regex-match. Dit script gebruikt een patroon dat de bestandsnaam in twee groepen verdeelt: één voor de basisnaam en één voor de extensie. Ten slotte kapselt het aangepaste functiescript de parameteruitbreidingslogica in een functie in, waardoor de herbruikbaarheid en leesbaarheid van de code wordt verbeterd. Het gebruikt local variable declaraties om variabelen binnen de functie te houden, waardoor onbedoelde bijwerkingen in grotere scripts worden voorkomen. Elke methode demonstreert een andere aanpak om hetzelfde probleem op te lossen, en toont de veelzijdigheid en kracht van Bash-scripting.

Parameteruitbreiding gebruiken in 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"

Awk gebruiken om bestandsnaam en extensie te scheiden

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

Reguliere expressies gebruiken in Bash

Bash-scripting met 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"

Een aangepaste functie gebruiken in Bash

Bash-scripting met aangepaste functie

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

Onderzoek naar alternatieve methoden voor bestandsmanipulatie in Bash

Naast de reeds besproken methoden zijn er in Bash nog andere nuttige technieken voor het manipuleren van bestandsnamen en extensies. Eén van deze methoden is het gebruik van de basename En dirname opdrachten. basename kan worden gebruikt om de bestandsnaam uit een pad te extraheren, terwijl dirname haalt het mappad op. Door deze opdrachten te combineren met parameteruitbreiding kunnen bestandsnamen en extensies effectief worden gescheiden. Gebruiken bijvoorbeeld basename "$FILE" ".${FILE##*.}" verwijdert de extensie van de bestandsnaam. Deze aanpak is vooral handig als u met volledige bestandspaden werkt in plaats van alleen met bestandsnamen.

Een andere methode is het gebruik sed, een krachtige streameditor voor het filteren en transformeren van tekst. Door geschikte reguliere expressies te maken, sed kan de bestandsnaam en extensie isoleren. De opdracht bijvoorbeeld echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' splitst de bestandsnaam en extensie en plaatst ze in afzonderlijke opnamegroepen. Deze techniek is flexibel en kan complexe bestandsnaamstructuren aan. Het verkennen van deze aanvullende tools en methoden vergroot uw mogelijkheden om bestandsgegevens in Bash te manipuleren, waardoor robuuste oplossingen voor verschillende scriptscenario's worden geboden.

Veelgestelde vragen over manipulatie van Bash-bestanden

  1. Wat is het doel van de ${FILE%.*} commando?
  2. Het verwijdert de extensie van de bestandsnaam door alles na de laatste punt te verwijderen.
  3. Hoe doet de ${FILE##*.} opdracht werken?
  4. Het extraheert de extensie door alles na de laatste punt in de bestandsnaam te nemen.
  5. Wat doet awk -F. doen in het meegeleverde script?
  6. Het stelt het veldscheidingsteken in op een punt, waardoor de bestandsnaam in delen kan worden opgesplitst.
  7. Waarom gebruiken NF-- in een awk script?
  8. Het vermindert het aantal velden met één, waardoor de extensie van de bestandsnaam effectief wordt verwijderd.
  9. Hoe helpen reguliere expressies bij het extraheren van de bestandsnaam en extensie?
  10. Ze maken patroonmatching en -groepering mogelijk, waardoor verschillende delen van de bestandsnaam kunnen worden geïsoleerd.
  11. Wat is het voordeel van het gebruik van een aangepaste functie in Bash?
  12. Een aangepaste functie verbetert de herbruikbaarheid en leesbaarheid van code, waardoor scripts modulairer worden.
  13. Hoe werkt basename hulp met bestandsnamen?
  14. Het extraheert de bestandsnaam uit een volledig bestandspad, waarbij optioneel de extensie wordt verwijderd.
  15. Kan sed worden gebruikt voor manipulatie van bestandsnamen?
  16. Ja, sed kan reguliere expressies gebruiken om delen van bestandsnamen te transformeren en te isoleren.

De oplossingen voor het extraheren van bestandsnamen en extensies afgerond

Concluderend kan het extraheren van bestandsnamen en extensies in Bash effectief worden bereikt via verschillende methoden, die elk geschikt zijn voor verschillende behoeften en voorkeuren. Of het nu gaat om parameteruitbreiding, awk, sed of aangepaste functies, deze technieken bieden flexibele en efficiënte oplossingen. Het begrijpen en gebruiken van deze opdrachten zorgt ervoor dat scripts foutloos bestandsnamen met meerdere punten en andere complexiteiten kunnen verwerken.