Vim: Преобразование обратных знаков в нотацию $() в сценарии оболочки

В 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//} - это подстановка шаблона, где # отмечает начало строки. Когда она применяется к массиву, она применяется ко всем значениям массива, по одному за раз.)

.

2
12.01.2017, 14:55
1 ответ

Вы можете попробовать

:% s/`\([^`]*\)`/$(\1)/gc

g делает его глобальным (для всех записей в строке), c делает vim , чтобы спрашивать пользователя о каждой замене.

Но это не будет работать с вложенными обратными кавычками и многострочным кодом. Только для парных обратных кавычек в линию.

Вы также можете выйти из vim и использовать для этого sed :

sed -n -i.backup 'N; ${s/`\([^`]*\)`/$(\1)/g; p; q}; b' filename

Он будет работать с многострочными бэктриками, но без вложенности.

5
27.01.2020, 21:59

Теги

Похожие вопросы