Найти и заменить после n совпадений и до m совпадений с AWK - PullRequest
0 голосов
/ 04 декабря 2018

В настоящее время я использую AWK, чтобы найти и заменить часть первых трех вхождений строки.Строка отформатирована как таковая, и в файле есть много таких строк:

func(tempID="39849235",count='12');

Используя эту ссылку , я смог найти методиспользования AWK для поиска и замены первых трех экземпляров строки.Я изменил его на то, что мне было нужно, и ниже приведен фрагмент моего скрипта:

id=12349876
awk 'BEGIN {matches=0}
     matches < 3 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID='"$id"'"); matches++ }
     { print $0 }' filName.py >filName.py.changed

Цель приведенного выше кода - найти соответствие в любой строке, содержащей tempID, и заменить номер, который ему присвоен.для tempID со значением, хранящимся в переменной с именем $id.Поиск и замена работает хорошо, но теперь я хочу заменить экземпляры 4-9 на другое число.Я попробовал следующий метод, но он все еще заменил только первые 5 экземпляров tempID:

id2=39843237
awk 'BEGIN {matches=4}
     matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID='"$id2"'"); matches++ }
     { print $0 }' filName.py >filName.py.changed

Есть ли другой способ реализовать это, чтобы заменить этот диапазон значений?Это не обязательно должно быть с AWK, это может быть с sed или любой другой утилитой Linux.

Edit: Ниже приведен пример того, как должны выглядеть строки до и после:

До:

func2(blah)
func3(blah)
func(tempID="83747432",count='12');
func(tempID="83747432",count='12');
func(tempID="83747432",count='12');
func(tempID="83747432",count='12');

func(tempID="83747432",count='12');
func(tempID="83747432",count='12');

После:

func2(blah)
func3(blah)
func(tempID="83747432",count='12');
func(tempID="83747432",count='12');
func(tempID="83747432",count='12');
func(tempID="39843237",count='12');

func(tempID="39843237",count='12');
func(tempID="39843237",count='12');

Обратите внимание, как изменяются строки после третьей строки, но только третья строка, соответствующая шаблону .*tempID.*

1 Ответ

0 голосов
/ 04 декабря 2018

Создание моего собственного примера входного файла с номерами в строках, которые соответствуют вызову вашей целевой функции, просто для того, чтобы выделить одинаковые, но не идентичные строки:

$ cat file
1 func(tempID="39849235",count='12');
boofunc(tempID="39849235",count='12');
2 here is one func(tempID="39849235",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
3 and another:           func(tempID="39849235",count='12');
4 func(tempID="39849235",count='12');
5 func(tempID="39849235",count='12');
6 func(tempID="39849235",count='12');
boofunc(tempID="39849235",count='12');
7 here is one func(tempID="39849235",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
8 and another:           func(tempID="39849235",count='12');
9 func(tempID="39849235",count='12');
10 func(tempID="39849235",count='12');

и использование GNU awk для 3-го аргументадля сопоставления ():

$ cat tst.awk
match($0,/(.*\<func\(tempID=")39849235(",count='12'\);.*)/,a) {
    ++cnt
    if ( (cnt >= beg) && (cnt <= end) ) {
        $0 = a[1] id a[2]
    }
}
{ print }

.

$ id=12349876
$ awk -v id="$id" -v beg=1 -v end=3 -f tst.awk file
1 func(tempID="12349876",count='12');
boofunc(tempID="39849235",count='12');
2 here is one func(tempID="12349876",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
3 and another:           func(tempID="12349876",count='12');
4 func(tempID="39849235",count='12');
5 func(tempID="39849235",count='12');
6 func(tempID="39849235",count='12');
boofunc(tempID="39849235",count='12');
7 here is one func(tempID="39849235",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
8 and another:           func(tempID="39849235",count='12');
9 func(tempID="39849235",count='12');
10 func(tempID="39849235",count='12');

.

$ id=12349876
$ awk -v id="$id" -v beg=4 -v end=9 -f tst.awk file
1 func(tempID="39849235",count='12');
boofunc(tempID="39849235",count='12');
2 here is one func(tempID="39849235",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
3 and another:           func(tempID="39849235",count='12');
4 func(tempID="12349876",count='12');
5 func(tempID="12349876",count='12');
6 func(tempID="12349876",count='12');
boofunc(tempID="39849235",count='12');
7 here is one func(tempID="12349876",count='12'); right there
func(tempID="99999999",count='12');
func(tempID="39849235",count='123');
8 and another:           func(tempID="12349876",count='12');
9 func(tempID="12349876",count='12');
10 func(tempID="39849235",count='12');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...