Как мне bash "есть" символы отступов, общие для всех строк в строке?

У меня есть многострочная строка в переменной оболочки. Все строки строки имеют неизвестный уровень отступа, по крайней мере, нескольких символов пробела (8 пробелов в моем примере, но могут быть произвольными). Давайте посмотрим на эту примерную строку, например:

        I am at the root indentation level (8 spaces).
        I am at the root indentation level, too.
            I am one level deeper
            Am too
        I am at the root again
                I am even two levels deeper
                    three
                two
            one
        common
        common

Я хочу использовать функцию или команду Bash, чтобы удалить общий уровень отступов (здесь 8 пробелов), поэтому я получаю следующее:

I am at the root indentation level (8 spaces).
I am at the root indentation level, too.
    I am one level deeper
    Am too
I am at the root again
        I am even two levels deeper
            three
        two
    one
common
common

Можно предположить, что первая строка этой строки всегда находится на этом общем уровне отступов. Каков самый простой способ сделать это? В идеале он должен работать при чтении строки по строкам.

Ответ 1

Вы можете использовать awk:

awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {sub("^ {"n"}", "")} 1' file
I am at the root indentation level (8 spaces).
I am at the root indentation level, too.
    I am one level deeper
    Am too
I am at the root again
        I am even two levels deeper
            three
        two
    one
common
common

Для первой записи (NR==1) мы сопоставляем пробелы в начале (match($0, /^ +/)) и сохраняем длину совпадения (RLENGTH) в переменной n.

Затем во время печати мы выделяем n пробелы в gsub("^ {"n"}", "").