Сопоставьте регулярное выражение в конце строки с AWK - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь сопоставить два разных регулярных выражения с длинными строками с помощью awk, удаляя ту часть строки, которая совпадает в окне из 35 символов. Проблема в том, что тот же набор кода работает, когда я ищу первый (который совпадает в начале), тогда как не совпадает со вторым (конец строки). Ввод:

Regexp1(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)Regexp2

Требуемый вывод

(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)

До сих пор я использовал этот код, который правильно извлекает Regexp1, но, к сожалению, не может извлечь также Regexp2, так как проиндексирован RSTART и RLENGTHдля Regexp2 неверны. Код для извлечения Regexp1 (правильный вывод):

awk -v F="Regexp1" '{if (match(substr($1,1,35),F)) print   substr($1,RSTART,RLENGTH)}' file

Код для извлечения Regexp2 (неправильный вывод)

awk -v F="Regexp2" '{if (match(substr($1,length($1)-35,35),F)) print substr($1,RSTART,RLENGTH)}' file

Несмотря на то, что индексы для Regexp1 верны, для Regexp2 индексы wrond (RSTART= 13). Я не могу понять, как извлечь второе регулярное выражение.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Если это не все, что вам нужно:

$ sed 's/Regexp1\(.*\)Regexp2/\1/' file
(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)

или использование GNU awk для gensub ():

$ awk '{print gensub(/Regexp1(.*)Regexp2/,"\\1",1)}' file
(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)

, затем отредактируйте свой вопрос, чтобы он был более понятным с вашими требованиямии пример.

1 голос
/ 04 ноября 2019

Учитывая, что ваш фактический файл Input_file совпадает с показанными примерами, в таком случае, пожалуйста, попробуйте тогда следовать (хорошо, если у вас есть новая версия awk, так как старые версии могут не поддерживать логику количества раз для регулярных выражений).

awk '
match($0,/\([0-9]+\){5}.*\([0-9]\){4}/){
  print substr($0,RSTART,RLENGTH)
}' Input_file

Если количество значений в скобках не фиксировано, вы можете сделать следующее:

awk '
match($0,/\([0-9]+\){1,}.*\([0-9]\){1,}/){
  print substr($0,RSTART,RLENGTH)
}' Input_file
...