Как мне 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"}", "")
.