Как убивать задания из скрипта, который их не очищал

Вот предлагаемое мной решение. Я взял ваш пример в качестве исходных данных. Идея:

  1. удалить все существующие отступы
  2. читать ввод построчно
  3. в каждой строке посчитайте количество открывающих скобок:(и [и {и соответственно увеличьте «уровень отступа»
  4. для той же строки подсчитайте закрывающие скобки и уменьшите «уровень отступа»
  5. заменить переменные, так как открытие скобок приводит к отступу следующей строки
  6. генерировать «строку отступа», которая представляет собой «символ отступа», повторяющийся «уровень отступа» несколько раз
  7. вывести "строку отступа" + содержимое каждой строки
  8. повторять до конца ввода

#!/usr/bin/env bash

fileToReindent='./testFile' indentCharacter='.'

countOccurrencesOfNeedleInHaystack() { local needle=$1 local haystack=$2 echo "$haystack" | grep -o "$needle" | wc -l }

makeIndentString() { local indentCharacter=$1 local indentLevel=$2 python -c "print('$indentCharacter' * $indentLevel)" }

# delete all existing indents sed -ri 's/^ (.)$/\1/' "$fileToReindent"

# indent lines indentLevelOfCurrentLine=0 indentLevelOfNextLine=0

while read line; do for character in '(' '[' '{'; do nb=$(countOccurrencesOfNeedleInHaystack "$character" "$line") indentLevelOfNextLine=$((indentLevelOfNextLine+nb)) done for character in ')' ']' '}'; do nb=$(countOccurrencesOfNeedleInHaystack "$character" "$line") indentLevelOfNextLine=$((indentLevelOfNextLine-nb)) done indentString=$(makeIndentString "$indentCharacter" "$indentLevelOfCurrentLine") indentLevelOfCurrentLine=$indentLevelOfNextLine echo "$indentString$line" done < "$fileToReindent"

NB :этот код является всего лишь доказательством концепции и все еще нуждается в доработке.

NB2 :проблемы с дополнительными пустыми строками в визуализируемом блоке кода. Правки приветствуются;-)

0
30.03.2021, 01:08
0 ответов

Теги

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