Если мы можем использовать гну grep:
cut -c$(grep -Fbo '*' <<<_"$con" | cut -f1 -d: | paste -sd,) <<<"$prot"
Я уверен, что это может играться в гольф больше, но это хорошо работает. -bo
причины grep для вывода (b) yte-смещения с (o) nly-соответствия (не целые строки), который как побочный эффект заставляет grep находить всеми соответствиями, не всего один на строку. Мы затем управляем этим в разделенный запятыми список чисел, к которым мы можем питаться как параметр командной строки cut
. Раздражающая деталь - то, что grep думает, что индексы символа на основе 0, и сокращение думает, что они на основе 1, таким образом, мы должны сместиться $con
одним символом; следовательно, _
.
$ con=" * ****** *** ** * **"
$ prot="M-ASDFRMKAWRGMLMI----WSGRCYYYYHQFLIMASDFRMKAMKAWWSGRCYNSHPPAAQVFYWLGLLSDVAGSALEAQ"
$ printf "%s\n%s\n" "$con" "$prot"
* ****** *** ** * **
M-ASDFRMKAWRGMLMI----WSGRCYYYYHQFLIMASDFRMKAMKAWWSGRCYNSHPPAAQVFYWLGLLSDVAGSALEAQ
$ cut -c"$(grep -Fbo '*' <<<_"$con" | cut -f1 -d: | paste -sd,)" <<<"$prot"
RYYHQFLMKAKAWGL
С GNU SED
:
sed '/binaries=(/,/)/{
//!d
/)/e uname
}'
Заменить uname
с вашей командой.
Я бы сделал это в awk, например:
awk '
f && /)/ { f=0 }
!f
!f && /binaries=\(/ { f=1 ; p=1 }
p { system ("your_command") ; p=0 }
'
где «your_command» определит замену.
Объяснение: флаг F
будет управлять состоянием; Если он установлен, вы находитесь в блоке, который должен быть заменен. С матчем начала и конечного шаблона флаг изменяется соответственно. В то время как вы находитесь в блоке, системный вызов будет выполняться; Флаг P
используется для печати его только один раз.
Чтобы заменить исходный файл создать новый файл и перезаписать оригинал один позже, или использовать недавнюю версию GNU awk
с вариантом --i Inflace
.