Wstęp:
Podczas pracy z plikami w Bash często może być konieczne oddzielenie nazwy pliku od jego rozszerzenia. Typowe podejście wykorzystuje polecenie `cut`, ale ta metoda może się nie powieść w przypadku nazw plików zawierających wiele kropek.
Na przykład nazwa pliku taka jak „a.b.js” zostanie niepoprawnie podzielona na „a” i „b.js” zamiast „a.b” i „js”. Chociaż Python zapewnia łatwe rozwiązanie za pomocą `os.path.splitext()`, użycie Pythona może nie zawsze być najbardziej efektywną opcją. W tym artykule omówiono lepsze metody realizacji tego zadania w języku Bash.
Komenda | Opis |
---|---|
${variable%.*} | Rozwijanie parametrów w celu usunięcia rozszerzenia z nazwy pliku. |
${variable##*.} | Ekspansja parametrów w celu wyodrębnienia rozszerzenia z nazwy pliku. |
awk -F. | Ustawia separator pól na kropkę używaną do podziału nazwy pliku. |
OFS="." | Separator pola wyjściowego w awk, używany do rekonstrukcji nazwy pliku bez rozszerzenia. |
NF-- | Zmniejsza liczbę pól o jeden w awk, skutecznie usuwając rozszerzenie. |
${BASH_REMATCH} | Tablica przechowująca dopasowania z wyrażenia regularnego w języku Bash. |
local variable | Deklaruje zmienną o zasięgu lokalnym w ramach funkcji w Bash. |
Szczegółowy podział rozwiązań Bash
Dostarczone skrypty oferują różne metody oddzielania nazwy pliku od jego rozszerzenia w Bash. Pierwszy skrypt wykorzystuje rozwinięcie parametrów Bash. Zmienna ${FILE%.*} usuwa rozszerzenie, usuwając wszystko od ostatniej kropki do końca łańcucha, while ${FILE##*.} przechwytuje rozszerzenie, biorąc wszystko po ostatniej kropce. Ta metoda jest prosta i wydajna w przypadku większości struktur nazw plików. Drugi skrypt wykorzystuje awk, potężne narzędzie do przetwarzania tekstu w środowiskach uniksowych. Ustawiając separator pól na kropkę za pomocą -F., pozwala na podzielenie nazwy pliku na części. Separator pola wyjściowego, OFS="."i zmniejszenie liczby pól za pomocą NF-- to techniki ponownego składania nazwy pliku bez jej rozszerzenia.
Trzeci skrypt wykorzystuje wyrażenia regularne w języku Bash, wykorzystując je ${BASH_REMATCH} do przechwytywania grup w dopasowaniu wyrażeń regularnych. Skrypt ten wykorzystuje wzorzec dzielący nazwę pliku na dwie grupy: jedną dla nazwy podstawowej i jedną dla rozszerzenia. Wreszcie niestandardowy skrypt funkcji hermetyzuje logikę rozszerzania parametrów w funkcji, zwiększając możliwość ponownego użycia i czytelność kodu. To używa local variable deklaracje utrzymujące zmienne w zasięgu funkcji, zapobiegając niezamierzonym efektom ubocznym w większych skryptach. Każda metoda demonstruje inne podejście do rozwiązania tego samego problemu, ukazując wszechstronność i moc skryptów Bash.
Korzystanie z rozwijania parametrów w Bash
Skrypty w Bashu
#!/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"
Używanie Awk do oddzielenia nazwy pliku i rozszerzenia
Bash z 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"
Używanie wyrażeń regularnych w Bashu
Skrypty Bash z wyrażeniem regularnym
#!/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"
Korzystanie z funkcji niestandardowej w Bash
Skrypty Bash z funkcją niestandardową
#!/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"
Odkrywanie alternatywnych metod manipulacji plikami w Bash
Oprócz omówionych już metod, w Bash istnieją inne przydatne techniki manipulowania nazwami plików i rozszerzeniami. Jedna z takich metod polega na użyciu basename I dirname polecenia. basename można użyć do wyodrębnienia nazwy pliku ze ścieżki, podczas gdy dirname pobiera ścieżkę katalogu. Połączenie tych poleceń z rozwijaniem parametrów może skutecznie oddzielić nazwy plików i rozszerzenia. Na przykład za pomocą basename "$FILE" ".${FILE##*.}" usuwa rozszerzenie z nazwy pliku. To podejście jest szczególnie przydatne podczas pracy z pełnymi ścieżkami plików, a nie tylko nazwami plików.
Inna metoda polega na użyciu sed, potężny edytor strumieniowy do filtrowania i przekształcania tekstu. Tworząc odpowiednie wyrażenia regularne, sed może wyizolować nazwę pliku i rozszerzenie. Na przykład polecenie echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' dzieli nazwę pliku i rozszerzenie, umieszczając je w oddzielnych grupach przechwytywania. Ta technika jest elastyczna i może obsługiwać złożone struktury nazw plików. Poznawanie tych dodatkowych narzędzi i metod rozszerza możliwości manipulowania danymi plików w Bash, zapewniając niezawodne rozwiązania dla różnych scenariuszy skryptowych.
Często zadawane pytania dotyczące manipulacji plikami Bash
- Jaki jest cel ${FILE%.*} Komenda?
- Usuwa rozszerzenie z nazwy pliku, usuwając wszystko po ostatniej kropce.
- W jaki sposób ${FILE##*.} polecenie pracy?
- Wyodrębnia rozszerzenie, pobierając wszystko po ostatniej kropce w nazwie pliku.
- Co robi awk -F. zrobić w dostarczonym skrypcie?
- Ustawia separator pól na kropkę, umożliwiając podzielenie nazwy pliku na części.
- Po co używać NF-- w awk scenariusz?
- Zmniejsza liczbę pól o jeden, skutecznie usuwając rozszerzenie z nazwy pliku.
- W jaki sposób wyrażenia regularne pomagają w wyodrębnianiu nazwy pliku i rozszerzenia?
- Umożliwiają dopasowywanie wzorców i grupowanie, co pozwala izolować różne części nazwy pliku.
- Jaka jest korzyść z używania funkcji niestandardowej w Bash?
- Funkcja niestandardowa zwiększa możliwość ponownego wykorzystania i czytelność kodu, czyniąc skrypty bardziej modułowymi.
- Jak basename pomoc z nazwami plików?
- Wyodrębnia nazwę pliku z pełnej ścieżki pliku, opcjonalnie usuwając rozszerzenie.
- Móc sed być używany do manipulacji nazwami plików?
- Tak, sed może używać wyrażeń regularnych do przekształcania i izolowania części nazw plików.
Podsumowanie rozwiązań do wyodrębniania nazw plików i rozszerzeń
Podsumowując, wyodrębnianie nazw plików i rozszerzeń w Bash można skutecznie osiągnąć różnymi metodami, z których każda jest dostosowana do różnych potrzeb i preferencji. Niezależnie od tego, czy używasz funkcji rozwijania parametrów, awk, sed czy funkcji niestandardowych, techniki te oferują elastyczne i wydajne rozwiązania. Zrozumienie i wykorzystanie tych poleceń gwarantuje, że skrypty będą mogły bezbłędnie obsługiwać nazwy plików zawierające wiele kropek i inne złożoności.