On Wednesday 25 November 2009, Massimo Danieli wrote:
> ho in un filediciamo fatto cosi
>
> user pippo {
>
> password crypt "1"
>
> description "test"
>
> group 500
>
> home "/home/test"
>
> shell "/usr/bin/pippo"
>
> role guest in Common
>
> }
>
> se trovo "role guest" devo sostituire shell "qualsiasi cosa qui dentro"
> con "/bin/false"
Ma proprio cosi' con le righe vuote tra una e l'altra?
Se si puo' assumere che la riga "role" e' sempre immediatamente dopo la riga
"shell", puoi fare
awk '/^shell/{
s=$0
getline;getline
if(/^role guest/)s="shell \"/bin/false\""
$0 = s ORS ORS $0
}
1'
Metti una sola "getline" e un solo ORS se non ci sono le linee vuote.
Se invece le righe non hanno un ordine prestabilito, puoi fare questo
(assumendo che un blocco cominci con "user ... {" e finisca con "}"):
awk '/^user [^ ]+ {/ {
count=guest=0
inblock=1
}
!inblock
{
block[++count]=$0
if(/^shell/)shell=count
if(/^role guest/)guest=1
}
/^}$/ {
if(guest)block[shell]="shell \"/bin/false\""
for(i=1;i<=count;i++){
print block[i]
}
inblock=0
}'
|