根据字符串更改行

根据字符串更改行

我希望输出更改如下。

  • 包含的行(GROUP ) R应该以 sg 开头,并将其替换(GROUP ) Rprops(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表达式的命令。

  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

相关内容