문자열을 기준으로 행 변경

문자열을 기준으로 행 변경

출력을 다음과 같이 변경하고 싶습니다.

  • 포함된 줄은 sg로 시작하고 다음 으로 (GROUP ) R바꿔야 합니다.(GROUP ) Rprops(USERLIST)
  • 포함하는 줄은 (USER ) Rsu로 시작하고 (USER ) R줄 끝에서 제거되어야 합니다.

파일 1.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 

예상 출력

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 

답변1

그리고AWK:

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

그리고SED:

 sed -i '/GROUP/ s/.*\(group[0-9]\).*/sg \1 props(USERLIST)/g;/USER/ s/.*\(user[0-9]\).*/su \1/g' file1.txt

답변2

sed -e '/(GROUP  ) R/{s//props(USERLIST)/; s/^/sg /;}' \
    -e '/(USER   ) R/{s///;                s/^/su /;}' \
    -e 's/[[:blank:]][[:blank:]]*/ /g' file >newfile

sed세 가지 표현이 있는 명령 입니다 sed.

  1. 다음을 포함하는 줄 의 경우 (GROUP ) R해당 문자열을 로 바꾸고 줄 시작 부분에 props(USERLIST)삽입합니다 .sg
  2. 포함된 줄의 경우 (USER ) R: 문자열을 제거하고 su줄 시작 부분에 삽입합니다.
  3. 여러 개의 연속된 공백 문자를 모든 줄에서 단일 공백으로 바꿉니다.

결과가 기록 newfile되고 주어진 입력에 대한 출력은 다음과 같습니다.

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

답변3

sed '/(GROUP[ \t]\+)[ \t]R/s/^.*\(group[[:digit:]]*\).*/sg \1 props(USERLIST)/;/(USER[ \t]\+)[ \t]R/s/.*\(user[[:digit:]]*\).*/su \1/' file1.txt

답변4

@SivaPrasath의 솔루션과 매우 유사하지만 전체적으로 일치합니다.(GROUP/USER ) R

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

관련 정보