Alterar linha baseada em string

2

Eu gostaria que a saída fosse alterada conforme abaixo.

  • A linha que contém (GROUP ) R deve ter sg começando da linha e substituir o (GROUP ) R por props(USERLIST)
  • A linha que contém (USER ) R deve ter su começando da linha e remover (USER ) R do final da linha.

file1.txt

host server1  
    group1        (GROUP  ) R  
    group2        (GROUP  ) R  
    group3        (GROUP  ) R  
    group4        (GROUP  ) R  
    user1         (USER   ) R  
    user2         (USER   ) R  
host server2  
    group5        (GROUP  ) R  
    group6        (GROUP  ) R  
    group7        (GROUP  ) R  
    user3         (USER   ) R  
    user4         (USER   ) R  
host server3  
    group8        (GROUP  ) R  
    group9        (GROUP  ) R  
    user5         (USER   ) R  
    user6         (USER   ) R 

Resultado esperado

host server1  
sg group1 props(USERLIST)  
sg group2 props(USERLIST)  
sg group3 props(USERLIST)  
sg group4 props(USERLIST)  
su user1  
su user2  
host server2  
sg group5 props(USERLIST)  
sg group6 props(USERLIST)  
sg group7 props(USERLIST)  
su user3  
su user4  
host server3  
sg group8 props(USERLIST)  
sg group9 props(USERLIST)  
su user5  
su user6 
    
por Binish 09.07.2018 / 15:09

4 respostas

2

Com o AWK :

 awk '{if( $2 == "(GROUP" ) {print "sg "$1" props(USERLIST)"} else if ( $2 == "(USER"  )  {print "su "$1} else print $0}' file1.txt

Com SED :

 sed -i '/GROUP/ s/.*\(group[0-9]\).*/sg  props(USERLIST)/g;/USER/ s/.*\(user[0-9]\).*/su /g' file1.txt
    
por 09.07.2018 / 15:37
2
sed -e '/(GROUP  ) R/{s//props(USERLIST)/; s/^/sg /;}' \
    -e '/(USER   ) R/{s///;                s/^/su /;}' \
    -e 's/[[:blank:]][[:blank:]]*/ /g' file >newfile

Este é um comando sed com três expressões sed .

  1. Para linhas que contêm (GROUP ) R : substitua essa sequência por props(USERLIST) e insira sg no início da linha.
  2. Para linhas que contêm (USER ) R : remova essa sequência e insira su no início da linha.
  3. Substitua vários caracteres de espaços em branco consecutivos por um único espaço em todas as linhas.

O resultado é escrito em newfile e, para a entrada dada, a saída será

host server1
sg group1 props(USERLIST)
sg group2 props(USERLIST)
sg group3 props(USERLIST)
sg group4 props(USERLIST)
su user1
su user2
host server2
sg group5 props(USERLIST)
sg group6 props(USERLIST)
sg group7 props(USERLIST)
su user3
su user4
host server3
sg group8 props(USERLIST)
sg group9 props(USERLIST)
su user5
su user6
    
por 09.07.2018 / 16:33
0
sed '/(GROUP[ \t]\+)[ \t]R/s/^.*\(group[[:digit:]]*\).*/sg  props(USERLIST)/;/(USER[ \t]\+)[ \t]R/s/.*\(user[[:digit:]]*\).*/su /' file1.txt
    
por 09.07.2018 / 15:23
0

Muito parecido com a solução do @SivaPrasath, mas combinando todo o (GROUP/USER ) R

awk '/\(GROUP\s*\) R/ { printf "sg %s props(USERLIST)\n",$1; };
     /\(USER\s*\) R/  { printf "su %s\n",$1 }' file1.txt
    
por 09.07.2018 / 15:44

Tags