Wyciąganie podłańcuchów w Bashu

Biorąc pod uwagę nazwę pliku w postaci someletters_12345_moreleters.ext, chcę wyodrębnić 5 cyfr i umieścić je w zmiennej.

Tak więc, aby podkreślić punkt, mam nazwę pliku z x liczbą znaków, a następnie pięciocyfrową sekwencję otoczoną pojedynczym podkreśleniem po obu stronach, a następnie inny zestaw x liczby znaków. Chcę pobrać pięciocyfrowy numer i umieścić go w zmiennej.

Jestem bardzo zainteresowany liczbą różnych sposobów, na jakie można to osiągnąć.

Rozwiązanie

Użyj cut:

echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2

Bardziej ogólne:

INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
Komentarze (7)

Generyczne rozwiązanie, gdzie numer może być w dowolnym miejscu nazwy pliku, wykorzystujące pierwszy z takich ciągów:

number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)

Inne rozwiązanie, aby wyodrębnić dokładnie część zmiennej:

number=${filename:offset:length}

Jeśli nazwa pliku zawsze ma format stuff_digits_... możesz użyć awk:

number=$(echo $filename | awk -F _ '{ print $2 }')

Jeszcze inne rozwiązanie, aby usunąć wszystko oprócz cyfr, użyj

number=$(echo $filename | tr -cd '[[:digit:]]')
Komentarze (1)

Istnieje również wbudowane polecenie bash 'expr':

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
Komentarze (2)