В настоящее время я использую AWK, чтобы найти и заменить часть строки после первых трех вхождений шаблона. Строка отформатирована следующим образом: func(tempID="39849235",count='12'); и в файле есть много таких строк, как показано ниже:

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

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

id=12349876
awk -v id="$id" '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 -v id2="$id2" 'BEGIN {matches=4}
     matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\""); matches++ }
     { print $0 }' filName.py >filName.py.changed

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

1 ответ1

0

Ваши matches=4 и matches < 9 означают «предположим, что было уже 4 матча, действуйте, пока их не будет 9». Вот почему первые 5 экземпляров заменены. Вам нужно запустить форму 0, как и раньше, затем включить нижний предел в логику:

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

Обратите внимание, что вам нужно выполнить замену в соответствии со значением matches но вам нужно увеличивать это значение каждый раз, когда происходит совпадение. Ваш оригинальный код заменил текст и увеличил значение в одном блоке. Когда не было замены из-за слишком высоких matches , значение больше не увеличивалось, но это больше не имело значения. Теперь вы не можете сойти с рук с этим простым подходом. Когда нет никакой замены из - за matches слишком низким, вам все еще нужно , чтобы увеличить значение , если есть соответствующий строка найден.

Отсюда два {} блока с отдельными условиями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .