출력을 다음과 같이 변경하고 싶습니다.
- 포함된 줄은 sg로 시작하고 다음 으로
(GROUP ) R
바꿔야 합니다.(GROUP ) R
props(USERLIST)
- 포함하는 줄은
(USER ) R
su로 시작하고(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
.
- 다음을 포함하는 줄 의 경우
(GROUP ) R
해당 문자열을 로 바꾸고 줄 시작 부분에props(USERLIST)
삽입합니다 .sg
- 포함된 줄의 경우
(USER ) R
: 문자열을 제거하고su
줄 시작 부분에 삽입합니다. - 여러 개의 연속된 공백 문자를 모든 줄에서 단일 공백으로 바꿉니다.
결과가 기록 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