Оказывается, что все классы 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());
Используйте , сокращает :
echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2
Более универсальный:
INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
Существует также удар встроенная команда 'expr':
INPUT="someletters_12345_moreleters.ext"
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `
echo $SUBSTRING
Универсальное решение, где число может быть где угодно в имени файла, с помощью первой из таких последовательностей:
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:]]')
Построение на ответе jor (который не работает на меня):
substring=$(expr "$filename" : '.*_\([^_]*\)_.*')
Если x является постоянным, следующее расширение параметра выполняет извлечение подстроки:
b=${a:12:5}
то, где 12 (основанное на нуле) смещение и 5 , является длиной
, Если подчеркивания вокруг цифр являются единственными во входе, можно снять изоляцию с префикса и суффикса (соответственно) на двух шагах:
tmp=${a#*_} # remove prefix ending in "_"
b=${tmp%_*} # remove suffix starting with "_"
, Если существуют другие подчеркивания, это, вероятно, выполнимо так или иначе, хотя более хитрый. Если кто-либо знает, как выполнить оба расширения в отдельном выражении, я хотел бы знать также.
Обоими представленными решениями является чистый удар, без включенного порождения процесса, следовательно очень быстро.
Без любых подпроцессов Вы можете:
shopt -s extglob
front=${input%%_+([a-zA-Z]).*}
digits=${front##+([a-zA-Z])_}
А очень маленький вариант этого будет также работать в ksh93.
Вот то, как я сделал бы это:
FN=someletters_12345_moreleters.ext
[[ ${FN} =~ _([[:digit:]]{5})_ ]] && NUM=${BASH_REMATCH[1]}
Примечание: вышеупомянутое является регулярным выражением и ограничивается Вашим определенным сценарием пяти цифр, окруженных подчеркиваниями. Измените регулярное выражение при необходимости в различном соответствии.