2015-10-21 8:09 GMT+03:00 Mircea MITU <mir...@sigu.ro>: > Salut > > Vreau sa schimb un anumit text dintr-in fisier in functie de prezenta unui > anumit string pe acea linie. > > De exemplu vreau sa schimb shell-ul userilor care au home-ul in /home/ din > bash in kk. > > Liniile le obtin cu > > grep “/home/.*bash$" /etc/passwd > > insa cum i le transmit lui sed sa faca s/bash/kk/g doar pe liniia > respectiva? > > Multumesc, > Mircea >
Offf, asa ma enerveaza oamenii care stiu doar "global search replace" in sed si "afiseaza coloana x" in awk. Metalimbajul e mult mai flexibil. Orice comanda de sed poate fi prefixata de o adresa, care poate fi specificata fie ca numar de linie, fie ca regular expression, fie "de la pana la". In cazul tau sed ar fi sed '/bash$/s/bash/kk/' /etc/passwd. Adicatelea "inlocuieste "bash" cu "kk" doar pe liniile care se termina cu "bash". Desi daca faci s/bash$/kk/ global e acelasi lucru, da' ai mai invatat ceva azi. Da' vorba lui mirceac, poate nu ar fi cazul sa dai cu toporul prin passwd si ar fi bine sa fii ceva mai precis. Gen: awk 'BEGIN {FS=":"; OFS=":" } $7=="/bin/bash" {$7="kk"} {print $0}' /etc/passwd (urmand sa pui tu noul content in /etc/passwd dupa aia) Sau ca sa nu modifici tu cu scripturi idioate fisiere critice de sistem, awk -F: ' $7=="/bin/bash" {print $1} ' | while read user ; do chsh -s kk $user ; done -- P. _______________________________________________ RLUG mailing list RLUG@lists.lug.ro http://lists.lug.ro/mailman/listinfo/rlug