Ну, у меня было немного свободного времени, поэтому я решил снова пережить свои старые добрые времена в Linux:]
Прочитав немного о awk и sed, я решил, что может быть лучше использовать оба, так как проще добавить отступ в awk и разобрать строки в sed.
Вот ~ / sed_script, который форматирует исходный файл:
# delete indentation
s/^ \+//g
# format lines with class
s/^\(.\+class.\+\) *\({.*\)$/\1\n\2/g
# format lines with methods
s/^\(public\|private\)\( \+static\)\?\( \+void\)\? \+\(.\+(.*)\) *\({.*\)$/\1\2\3 \4\n\5/g
# format lines with other structures
/^\(if\|else\|for\|while\|case\|do\|try\)\([^{]*\)$/,+1 { # get lines not containing '{'
# along with the next line
/.*{.*/ d # delete the next line with '{'
s/\([^{]*\)/\1 {/g # and add '{' to the first line
}
А вот ~ / awk_script, который добавляет отступ:
BEGIN { depth = 0 }
/}/ { depth = depth - 1 }
{
getPrefix(depth)
print prefix $0
}
/{/ { depth = depth + 1 }
function getPrefix(depth) {
prefix = ""
for (i = 0; i < depth; i++) { prefix = prefix " "}
return prefix
}
И вы используете их так:
> sed -f ~/sed_script ~/file_to_format > ~/.tmp_sed
> awk -f ~/awk_script ~/.tmp_sed
Это далеко не правильный инструмент форматирования, но я надеюсь, что он хорошо подойдет в качестве примера сценария для справки:] Удачи в изучении.