Давайте рассмотрим этот тестовый файл:
$ cat file1
preceeding line
line I need to add spaces to
preceeding line
preceeding line
line I need to add spaces to
Следующие отступы строк без отступа соответствуют отступу предыдущей строки:
$ awk '{if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
preceeding line
line I need to add spaces to
preceeding line
preceeding line
line I need to add spaces to
Как это устроено
if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}
Если строка начинается с пустой строки или табуляции, добавьте отступ x
в начало строки.
В противном случае сохраните отступ из текущей строки в переменной x
.
1
Это загадочное сокращение awk для print-the-line.
Многострочная версия
Для тех, кто предпочитает свой код в несколько строк:
awk '
{
if (/^[^ \t]/)
$0=x $0
else {
x=$0
sub(/[^ \t].*/, "", x)
}
}
1' file1
Ограничение изменений в строках от 100 до 500
awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
Изменение файла на месте
Использование GNU awk:
awk -i inplace 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
Использование BSD/OSX awk:
awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1 >tmp && mv tmp file1