Как написать скрипт для отступа строк во входных файлах в зависимости от глубины вложенности скобок?

Так это делалось до :того, как вы просто «разрезали» диск на разделы, каждый из которых содержал файловую систему (, также известную как файлы и каталоги ).

/dev/sda1 => / from 0 to 12
/dev/sda2 => swap from 13 to 53
/dev/sda3 => /usr from 54 to 114
/dev/sda4 => /var from 115 to 156
free    from 157 to end of disk

(номер псевдоблока)

Теперь проблема в том, что когда вы хотите увеличить, скажем, /usr, вы будете перекрывать /var. Имея свободное место после, но все еще нуждаясь в громоздком перемещении для расширения /usr.

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

Также имейте в виду, что логический том редко используется сам по себе, в большинстве случаев поверх него помещается файловая система (ext4, xfsи многие другие ).

Стек LVM (из физического в логический )выглядит так

  • диск (PV :Физический том)
  • Группа томов (VG):один или несколько PV
  • Логический том (LV):часть LV, при необходимости может быть зеркально отражена, может быть динамически перемещена из PV в другой (в той же VG ).

Не является частью LVM:

  • Под LVM находятся устройство SAN, локальный диск или виртуальный диск
  • Над LVM находятся файловая система или своп.
  • Некоторые программы могут использовать прямой доступ к LV. (У меня нет примера, хотя ).
1
08.05.2019, 09:23
2 ответа

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

  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 :проблемы с дополнительными пустыми строками в визуализируемом блоке кода. Правки приветствуются;-)

-1
28.01.2020, 00:12

«Как написать скрипт» :вы разбиваете задачу на более мелкие шаги, которые легче перевести в код:

  1. читать ваш файл по одной строке за раз
  2. подсчитать количество открытых/закрытых скобок и соответствующим образом обновить промежуточный итог
    • это можно сделать, обрабатывая строку по одному символу за раз, или другими способами
  3. создать строку из cсимволов, длина которой составляет «нарастающее количество» символов
  4. напечатайте эту строку и строку.
  5. подумайте о крайних случаях и условиях ошибки :учитывая предположение в вашем вопросе,это было бы для дополнительного кредита, я думаю :
    • что произойдет, если промежуточный итог станет отрицательным
    • что произойдет, если промежуточная сумма в конце файла больше нуля
1
28.01.2020, 00:12

Теги

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