Изменить строку на основе строки

set - это встроенный в bash (и, вероятно, большинство других оболочек). Это означает, что bash даже не будет искать путь при поиске функции.

В качестве дополнительного замечания, я бы настоятельно не советовал добавлять . на путь из соображений безопасности. Представьте, например, что cd выходит из / tmp после того, как любой другой пользователь добавил исполняемый файл / tmp / cd .

2
15.09.2018, 22:17
3 ответа

С АВК:

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

С СЭД:

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

Очень похоже на решение @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
0
27.01.2020, 21:58
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
2
27.01.2020, 21:58

Теги

Похожие вопросы