文字列に基づいて行を変更する

文字列に基づいて行を変更する

出力を次のように変更したいと思います。

  • 含まれている行は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

sed3つの表現があるコマンドです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

関連情報