Извлечь подстроку в Bash

Оказывается, что все классы SomeProxy, с которыми я хочу иметь дело, на самом деле просто переопределяют один метод из Proxy<T>, который имеет подпись:

 T LoadInternal(Identifier id)

Итак, что я сделал создается внутренний класс внутри MyClass, который принимает Func<Identifier, T> в своем конструкторе. Затем я могу передать Func<Identifier, T> в качестве параметра конструктору MyClass и использовать свой подкласс вместо SomeProxy.

Кажется немного запутанным, но он работает для меня. Подводя итог, теперь у меня есть:

public class MyClass<T>{
    private SomeProxy theProxy;

    public MyClass(Func<Identifier, T> loadDelegate){
        theProxy = new SomeProxy(loadDelegate);
    }

    /* Other methods here */

    class SomeProxy : Proxy<T>{
        private Func<Identifier, T> m_loadInternal;

        public SomeProxy(Func<Identifier, T> loadInternal){
            m_loadInternal = loadInternal;
        }

        protected override T LoadInternal(Identifier id){
            return m_loadInternal(id);
        }
    }
}

Итак, из клиентского кода вместо написания класса, который расширяет прокси и затем переопределяет LoadInternal в этом классе, я просто создаю MyClass, используя:

var myClass = new MyClass<T>(x => CodeWhichReturnsT());
633
задан codeforester 9 October 2017 в 04:03
поделиться

7 ответов

Используйте , сокращает :

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

Более универсальный:

INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
612
ответ дан Victor Yarema 9 October 2017 в 04:03
поделиться
  • 1
    спасибо за совет, я сделаю это наверняка. Аплодисменты – emcee22 21 February 2013 в 15:47

Существует также удар встроенная команда 'expr':

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
1
ответ дан jor 9 October 2017 в 04:03
поделиться

Универсальное решение, где число может быть где угодно в имени файла, с помощью первой из таких последовательностей:

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

Другое решение извлечь точно часть переменной:

number=${filename:offset:length}

, Если Ваше имя файла всегда имеет формат stuff_digits_..., можно использовать awk:

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

еще одно решение удалить все кроме цифр, используйте

number=$(echo $filename | tr -cd '[[:digit:]]')
90
ответ дан Johannes Schaub - litb 9 October 2017 в 04:03
поделиться

Построение на ответе jor (который не работает на меня):

substring=$(expr "$filename" : '.*_\([^_]*\)_.*')
20
ответ дан PEZ 9 October 2017 в 04:03
поделиться

Если x является постоянным, следующее расширение параметра выполняет извлечение подстроки:

b=${a:12:5}

то, где 12 (основанное на нуле) смещение и 5 , является длиной

, Если подчеркивания вокруг цифр являются единственными во входе, можно снять изоляцию с префикса и суффикса (соответственно) на двух шагах:

tmp=${a#*_}   # remove prefix ending in "_"
b=${tmp%_*}   # remove suffix starting with "_"

, Если существуют другие подчеркивания, это, вероятно, выполнимо так или иначе, хотя более хитрый. Если кто-либо знает, как выполнить оба расширения в отдельном выражении, я хотел бы знать также.

Обоими представленными решениями является чистый удар, без включенного порождения процесса, следовательно очень быстро.

972
ответ дан GreenGiant 9 October 2017 в 04:03
поделиться

Без любых подпроцессов Вы можете:

shopt -s extglob
front=${input%%_+([a-zA-Z]).*}
digits=${front##+([a-zA-Z])_}

А очень маленький вариант этого будет также работать в ksh93.

10
ответ дан Darron 9 October 2017 в 04:03
поделиться
  • 1
    извините, я должен был разъяснить, что использую репозитории стиля плюща. я обновлю вопрос. – dev 27 May 2013 в 16:06

Вот то, как я сделал бы это:

FN=someletters_12345_moreleters.ext
[[ ${FN} =~ _([[:digit:]]{5})_ ]] && NUM=${BASH_REMATCH[1]}

Примечание: вышеупомянутое является регулярным выражением и ограничивается Вашим определенным сценарием пяти цифр, окруженных подчеркиваниями. Измените регулярное выражение при необходимости в различном соответствии.

12
ответ дан nicerobot 9 October 2017 в 04:03
поделиться
  • 1
    хотите объяснить what' s проблема моего ответа, или @Peter' s ответ? – tibtof 26 July 2012 в 07:43