Сценарий оболочки, чтобы найти и заменить строку patten после исключения шаблона mutiple - PullRequest
0 голосов
/ 24 августа 2018

Мне нужно изменить следующие детали:

  1. Поиск в каждом файле оболочки, каждая строка содержит «echo» или «echo -e» (до или после echo может быть пробел) заменить на «logger»который содержит перенаправление в другой файл
  2. Если строка содержит только «echo», также необходимо заменить на «logger»
  3. «\ n» или «\ t» заменить на пустое место в каждой строке
  4. Найдите «2> & 1» и удалите до конца строки

Но «эхо» в других местах не должно быть изменено.Другие места означают:

  1. Внутри sqlplus включите эхо или

  2. переменную эха, чтобы вырезать или назначить другой переменной и т. Д.

Пример файла: run.sh

1   echo "**********************"   2>&1 | tee -a  out.log
2   echo -e "**********************\n"   2>&1 | tee -a  out.log
3   
4   NBD=`sqlplus $dbconnection <<EOF | grep '^-' | sed 's/-//'
5   cl scr;
6   set serveroutput on;
7   set echo off;
8   set head off;
9   set termout off
10  set verify off
11  set feedback off
12  cl scr;
13  select '-'||sysdate from dual;
14  exit;
15  EOF`
16  
17  Error_code=`echo $?`
18  echo 
19  file_name=$1
20  
21  echo spoolfile = $file_name
22  echo $spoolfile
23  echo $spoolfile |cut -d'|' -f4 | read str4
24   echo 
25  exit 0

Ожидаемый вывод: run_new.sh Измененные строки: 1,2, 18, 24

1   logger "**********************"
2   logger -e "**********************"
3   
4   NBD=`sqlplus $dbconnection <<EOF | grep '^-' | sed 's/-//'
5   cl scr;
6   set serveroutput on;
7   set echo off;
8   set head off;
9   set termout off
10  set verify off
11  set feedback off
12  cl scr;
13  select '-'||sysdate from dual;
14  exit;
15  EOF`
16  
17  Error_code=`echo $?`
18  logger
19  file_name=$1
20  
21  echo spoolfile = $file_name
22  echo $spoolfile
23  echo $spoolfile |cut -d'|' -f4 | read str4
24   logger
25  exit 0

Я пробовал ниже:

shell_find_tee="2>&1"
f_in=run.sh
f_out=run_new.sh
# To remove line contains: $shell_find_tee
sed -e "s/$shell_find_tee.*//g" < $f_in > $f_out

#To find "echo" or "echo -e" replace by "logger"
shell_find_echo_main="echo"
shell_find_echo_main_e="echo.*-e"
shell_replace_echo="logger"

sed -e "s@$shell_find_echo_main_e@$shell_replace_echo@g" -e "s@$shell_find_echo_main@$shell_replace_echo@g" < $f_in > $f_out

Но эти команды заменяют все "echo" на "logger", и я не знаю, как исключить скороговорку в команде "sed" или любым другим способом.

Можеткто-нибудь, пожалуйста, помогите мне?

1 Ответ

0 голосов
/ 24 августа 2018

Может быть так:

  1. Найти строки, которые начинаются с (spaces)?echo( -e)?
    1. Если они содержат только echo или echo -e
      1. Заменить echo с logger
    2. Если строка также содержит 2>&1
      1. Заменить ведущий эхо-сигнал с помощью регистратора
      2. Заменить \t или \n с одним пробелом
      3. Удалить все после 2>&1

sed '
/^[[:space:]]*echo\([[:space:]]\+-e\)\?/{
     /^[[:space:]]*echo[[:space:]]\+\([[:space:]]\+-e\)\?[[:space:]]*$/{
           s/^\([[:space:]]*\)echo/\1logger/;
     };
     /2>&1/{
           s/^\([[:space:]]*\)echo/\1logger/;
           s/\\[tn]/ /g;
           s/[[:space:]]*2>&1.*//;
     }
 }'

Для тестовых случаевпохоже на работу:

diff <(cat run.sh | cut -c5-) <(cat run.sh | cut -c5- | sed '
    /^[[:space:]]*echo\([[:space:]]\+-e\)\?/{
         /^[[:space:]]*echo[[:space:]]\+\([[:space:]]\+-e\)\?[[:space:]]*$/{
               s/^\([[:space:]]*\)echo/\1logger/;
         };
         /2>&1/{
               s/^\([[:space:]]*\)echo/\1logger/;
               s/\\[tn]/ /g;
               s/[[:space:]]*2>&1.*//;
         }
     }')
1,2c1,2
< echo "**********************"   2>&1 | tee -a  out.log
< echo -e "**********************\n"   2>&1 | tee -a  out.log
---
> logger "**********************"
> logger -e "********************** "
18c18
< echo 
---
> logger 
24c24
<  echo 
---
>  logger 
...