Мне нужно изменить следующие детали:
- Поиск в каждом файле оболочки, каждая строка содержит «echo» или «echo -e» (до или после echo может быть пробел) заменить на «logger»который содержит перенаправление в другой файл
- Если строка содержит только «echo», также необходимо заменить на «logger»
- «\ n» или «\ t» заменить на пустое место в каждой строке
- Найдите «2> & 1» и удалите до конца строки
Но «эхо» в других местах не должно быть изменено.Другие места означают:
Внутри sqlplus включите эхо или
переменную эха, чтобы вырезать или назначить другой переменной и т. Д.
Пример файла: 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" или любым другим способом.
Можеткто-нибудь, пожалуйста, помогите мне?