Vamos considerar este arquivo de teste:
$ cat file1
preceeding line
line I need to add spaces to
preceeding line
preceeding line
line I need to add spaces to
O seguinte recua as linhas não recuadas para corresponder ao recuo da linha anterior:
$ 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
Como funciona
-
if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}
Se a linha não começar em branco nem com tabulação, adicione o indent
x
ao início da linha.Senão, salve o recuo da linha atual na variável
x
. -
1
Esta é uma abreviada enigmática do awk para imprimir a linha.
Versão multilinha
Para aqueles que preferem o código espalhado por várias linhas:
awk '
{
if (/^[^ \t]/)
$0=x $0
else {
x=$0
sub(/[^ \t].*/, "", x)
}
}
1' file1
Restringindo as alterações nas linhas de 100 a 500
awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
Alterando o arquivo no local
Usando o GNU awk:
awk -i inplace 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
Usando o awk do BSD / OSX:
awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1 >tmp && mv tmp file1