Semelhante à sugestão do Archemar , você pode fazer o script com ed
:
printf %s\n ${linenr}m${addr} w q | ed -s infile
ou seja,
linenr # is the line number
m # command that moves the line
addr=$(( linenr + 1 )) # if you move the line down
addr=$(( linenr - 2 )) # if you move the line up
w # write changes to file
q # quit editor
por exemplo. para mover a linha não. 21
uma linha:
printf %s\n 21m19 w q | ed -s infile
para mover a linha no. 21
uma linha abaixo:
printf %s\n 21m22 w q | ed -s infile
Mas como você só precisa mover uma determinada linha para cima ou para baixo em uma linha, pode também dizer que praticamente deseja trocar duas linhas consecutivas. Conheça sed
:
sed -i -n 'addr{h;n;G};p' infile
i.e.
addr=${linenr} # if you move the line down
addr=$(( linenr - 1 )) # if you move the line up
h # replace content of the hold buffer with a copy of the pattern space
n # read a new line replacing the current line in the pattern space
G # append the content of the hold buffer to the pattern space
p # print the entire pattern space
por exemplo. para mover a linha não. 21
uma linha:
sed -i -n '20{h;n;G};p' infile
para mover a linha no. 21
uma linha abaixo:
sed -i -n '21{h;n;G};p' infile
Eu usei a sintaxe gnu sed
acima. Se portabilidade é uma preocupação:
sed -n 'addr{
h
n
G
}
p' infile
Além disso, as verificações usuais: arquivo existe e é gravável; %código%; %código%; file_length > 2
;