В Bash или чем-то, что поддерживает массивы, вы можете поместить набор символов в массив и зациклиться на массиве, добавляя символы снова:
chars=( {a,b,c} )
doubles=()
triplets=()
for c in "${chars[@]}" ; do
doubles+=( ${chars[@]/#/$c} )
done
for c in "${chars[@]}" ; do
triplets+=( ${doubles[@]/#/$c} )
done
echo "${triplets[@]}"
это выводит aaa aab aac ... ccc
, и вы можете повторять по мере необходимости для более длинных, или превратить это в рекурсивную функцию. (${var//}
- это подстановка шаблона, где #
отмечает начало строки. Когда она применяется к массиву, она применяется ко всем значениям массива, по одному за раз.)
.
Вы можете попробовать
:% s/`\([^`]*\)`/$(\1)/gc
g
делает его глобальным (для всех записей в строке), c
делает vim
, чтобы спрашивать пользователя о каждой замене.
Но это не будет работать с вложенными обратными кавычками и многострочным кодом. Только для парных обратных кавычек в линию.
Вы также можете выйти из vim
и использовать для этого sed
:
sed -n -i.backup 'N; ${s/`\([^`]*\)`/$(\1)/g; p; q}; b' filename
Он будет работать с многострочными бэктриками, но без вложенности.