erlug
[Top] [All Lists]

Re: [Erlug] Sotituzione stringa (priamo o poi imparo lo giuro)

To: erlug@xxxxxxxxxxxxxx
Subject: Re: [Erlug] Sotituzione stringa (priamo o poi imparo lo giuro)
From: Davide Brini <db72@xxxxxxxxxxxx>
Date: Wed, 25 Nov 2009 20:51:02 +0000
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
}'

<Prev in Thread] Current Thread [Next in Thread>