Anotamos os pts / number quando encontramos a linha correspondente. A opção -p
irá autoprint
linhas. Quando alcançamos o eof
extraímos o hash %h
e o passamos pelo filtro grep
para determinar quais terminais não foram impressos e usamos map
para preparar o formato para que isso acontecesse.
perl -lpe 'm|^pts/([0-9])$| and $h{$1}++;
END{ print for map { "pts/$_" } grep { !$h{$_} } 0 .. 9; }
' /etc/securetty
Inicializamos o hold space
com números 0 1 2 ... 9. Sempre que encontramos a linha pts/[0-9]
, copiamos isso do espaço de espera. Em eof
, obtemos espaço de espera e, se algum número for encontrado, será massageado no formato correto e impresso.
sed -e '
# initialize the hold space with 0 1 ... 9
1{x;s|.*|'"$(echo {0..9})"'|;x}
# whatever be the line, it needs to be printed
p
# we meet a valid pts/ line
\|^pts/[0-9]$|{
# the hold space gets appended to the pattern space
G
# grab what is the pts number and search for it in the hold and
# delete itand store back the changes into hold space.
s|^pts/\([0-9]\)\n\(.*\) ||;h
}
# weve not arrived at the eof and weve processed the input so go no further
$!d
# we are at the eof, so we bring back the hold space. just in case all
# numbers were dealt with up, we simply bail out. Else, prepend the str
# pts/ to the numbers present and simply were home
g;/[0-9]/!d;s/ //g
s|[0-9]|pts/&\n|g;s/.$//
# *TIP*: Sprinkle the l, list pattern space at various places to see
# whats going on.
' /etc/securetty