Я собрал несколько наивный awk
скрипт, который должен быть в состоянии отступить ваши комментарии:
#!/usr/bin/gawk -f
BEGIN{
last_indent=0
}
{
indent=match($0, /[^ ]/) - 1
if (indent < 0) indent = 0
comment=0
}
/^#/{
comment=1
if (last_indent > 0) {
indent_str = sprintf("%*s", last_indent, " ")
$0 = indent_str $0
}
}
{
print
if (length($0) && ! comment) last_indent=indent
}
Запуск с:
$ cat src.py | ./reindent.awk
Он должен (это относится и к вашему файлу примера) напечатать входной файл питона с дополнительными пробелами, соответствующими текущему блоку, добавленному перед комментариями.
Я рассмотрел ваш дополнительный запрос на исправление кода в комментарии, но это крайне нетривиально, поскольку сценарий должен иметь достаточный уровень понимания того, что он обрабатывает.
Излишне говорить, что в большинстве случаев комментарии следует просто отбрасывать, а оставлять их - не очень аккуратная практика, по крайней мере, поскольку у нас есть системы контроля версий для источников (так в начале 70-х годов).
В простом примере, например, это может даже привести к успешному отступу кода в комментариях:
#!/usr/bin/gawk -f
BEGIN{
last_indent=0
commented_code_indent = 0
}
{
indent=match($0, /[^ ]/) - 1
if (indent < 0) indent = 0
comment=0
}
/^#/{
comment=1
if (last_indent > 0) {
indent_str = sprintf("%*s", last_indent, " ")
stripped = length($0)
sub(/# +/, "# ")
stripped -= length($0)
if (stripped > 0 && ! commented_code_indent) commented_code_indent = stripped
if (commented_code_indent > 0) {
indent_in_comment = stripped - commented_code_indent
if (indent_in_comment > 0) {
comment_indent_str = sprintf("%*s", indent_in_comment, " ")
sub(/# /, "# " comment_indent_str)
}
}
$0 = indent_str $0
}
}
{
print
if (length($0) && ! comment) last_indent=indent
if (! comment) commented_code_indent = 0
}
И да, если посмотреть на это сейчас, то, возможно, было бы проще, чем awk. :)