Переносимое решение с использованием awk
:
awk -v find=abcdef -v rep=pqrstu '{
lwr=tolower($0)
offset=index(lwr, tolower(find))
if( offset > 0 ) {
printf "%s", substr($0, 0, offset)
len=length(find)
for( i=0; i<len; i++ ) {
out=substr(rep, i+1, 1)
if( substr($0, offset+i, 1) == substr(lwr, offset+i, 1) )
printf "%s", tolower(out)
else
printf "%s", toupper(out)
}
printf "%s\n", substr($0, offset+len)
}
}'
Пример ввода:
other abcdef other
other Abcdef other
other AbCdEf other
Пример вывода:
other pqrstu other
other Pqrstu other
other PqRsTu other
Как указано в комментариях, приведенное выше заменит только первый экземпляр find
в каждой строке. Чтобы заменить все экземпляры:
awk -v find=abcdef -v rep=pqrstu '{
input=$0
lwr=tolower(input)
offset=index(lwr, tolower(find))
if( offset > 0 ) {
while( offset > 0 ) {
printf "%s", substr(input, 0, offset)
len=length(find)
for( i=0; i<len; i++ ) {
out=substr(rep, i+1, 1)
if( substr(input, offset+i, 1) == substr(lwr, offset+i, 1) )
printf "%s", tolower(out)
else
printf "%s", toupper(out)
}
input=substr(input, offset+len)
lwr=substr(lwr, offset+len)
offset=index(lwr, tolower(find))
}
print input
}
}'
Пример ввода:
other abcdef other ABCdef other
other Abcdef other abcDEF
other AbCdEf other aBCdEf other
Пример вывода:
other pqrstu other PQRstu other
other Pqrstu other pqrSTU
other PqRsTu other pQRsTu other
Я подозреваю, что проблема совершенно не связана с именами файлов и также может возникнуть, если вы загружаете .zshrc
в исходном состоянии.
Эта ошибка обычно возникает, когда вы вызываете функцию из самой себя, что приводит к рекурсии. Это может произойти непреднамеренно, когда вы даете функциям то же имя, что и внешняя команда или встроенная функция, используемая внутри этой функции. Например:
echo () {
echo "Out: " $@
}
Команда echo
будет работать нормально до того, как вы определите эту функцию, но после определения произойдет сбой с этой ошибкой:
% echo foobar
echo:1: maximum nested function level reached; increase FUNCNEST?
(Разница в тексте сообщения, вероятно, связана с используемыми версиями zsh, в моем случае это 5.6.2)
Это также может произойти из-за того, что несколько функций вызывают друг друга:
foo () {
echo $@
}
echo () {
something_else
foo $@
}
В сообщении об ошибке будет показано имя функции, которую больше нельзя вызывать из-за достижения предела вложенности, и строка функции, в которой происходит этот вызов. Таким образом, в приведенном выше случае либо:
% echo foobar
echo:1: maximum nested function level reached; increase FUNCNEST?
или
% echo foobar
foo:2: maximum nested function level reached; increase FUNCNEST?
В случае вопроса кажется, что функция с именем bash
вызывается в строке 30 какой-то функции.
Если рекурсия не является преднамеренной,этого можно избежать, указав zsh
, какую функциональную команду, отличную от -, вы хотите использовать.
Если вам нужна встроенная команда -, просто добавьте перед нейbuiltin
:
echo ()
{
builtin echo "Out: " $@
}
Если вам нужна внешняя команда, добавьте перед нейcommand
:
echo ()
{
command echo "Out: " $@
}
или используйте полный путь
echo ()
{
/bin/echo "Out: " $@
}
Если вы не уверены, где вы используете bash
в конфигурации zsh
, вы можете использовать grep
для рекурсивного поиска ${TOOLS_HOME}/cli/
:
grep -r bash ${TOOLS_HOME}/cli/