Скрипт для замены строки на другой похожий - PullRequest
0 голосов
/ 15 июня 2019

У меня есть каталог, где многие файлы SQL имеют код, как показано ниже (строка 1). Я хочу заменить все эти вхождения на строку 2. Может ли кто-нибудь предложить мне, как это может быть достигнуто?

Строка 1:
utl_file.Putf(g_logfile, '******This is sample log msg:' || '\n');


Строка 2:
  write_log(log_desc=> '****** This is sample log msg:', prc_name=>l_db_name); 

Ответы [ 2 ]

1 голос
/ 15 июня 2019
$ cat file
fooutl_file.Putf(g_logfile, '******This is sample log msg:' || '\n');bar

$ awk -i inplace '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]="" }
    s=index($0,old) {
        $0 = substr($0,1,s-1) new substr($0,s+length(old))
    }
1' \
    "utl_file.Putf(g_logfile, '******This is sample log msg:' || '\n');" \
    "write_log(log_desc=> '****** This is sample log msg:', prc_name=>l_db_name);" \
file

$ cat file
foowrite_log(log_desc=> '****** This is sample log msg:', prc_name=>l_db_name);bar

В приведенном выше примере GNU awk используется для редактирования на месте, поэтому вы можете изменить все свои файлы одним вызовом awk: awk 'script' *. С другими awks просто напишите в файл tmp в цикле: for f in *; do awk 'script' "$f" > tmp && mv tmp "$f"; done.

1 голос
/ 15 июня 2019

Вы имеете в виду что-то подобное?

#!/bin/sh

# loop over all *.sql files
for file in *.sql; do
   sed -i '
      # if pattern match --> replace the rest of line
      /utl_file.Putf(g_logfile,/ {s/ ||.*/, prc_name=>l_db_name);/}

      # if pattern match --> replace head of line 
      s/utl_file.Putf(g_logfile,/write_log(log_desc=>/
   ' "$file"
done

Запустите этот скрипт в каталоге с вашими sql-файлами.Все файлы с суффиксом * .sql будут обработаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...