awk извлекают несколько групп из каждой строки

SimpleTest ScriptableBrowser может использоваться независимо от среды тестирования. Я использовал его для многочисленных заданий автоматизации.

8
задан Alan Moore 12 July 2009 в 15:38
поделиться

4 ответа

This is a simple syntax, and every awk (nawk, mawk, gawk, etc) can use this.

{
    while (match($0, /Hello! [0-9]+/)) {
        pattern = substr($0, RSTART, RLENGTH);
        sub(/Hello! /, "", pattern);
        print pattern;
        $0 = substr($0, RSTART + RLENGTH);
    }
}
11
ответ дан 5 December 2019 в 12:11
поделиться

Это синтаксис gawk . Это также работает для шаблонов, когда нет фиксированного текста, который мог бы работать как разделитель записей и не совпадал с переводом строки:

 {
     pattern = "([a-g]+|[h-z]+)"
     while (match($0, pattern, arr))
     {
         val = arr[1]
         print val
         sub(pattern, "")
     }
 }
2
ответ дан 5 December 2019 в 12:11
поделиться

GNU awk

awk 'BEGIN{ RS="Hello! ";}
{
    gsub(/[^0-9].*/,"",$1)
    if ($1 != ""){ 
        print $1 
    }
}' file
1
ответ дан 5 December 2019 в 12:11
поделиться

Не существует функции gawk, которая бы соответствовала одному и тому же шаблону несколько раз в строке. Если вы точно не знаете, сколько раз шаблон повторяется.

Имея это, вы должны выполнять итерацию «вручную» для всех совпадений в одной строке. Для вашего примера ввода это будет:

{
  from = 0
  pos = match( $0, /Hello! ([0-9]+)/, val )
  while( 0 < pos )
  {
    print val[1]
    from += pos + val[0, "length"]
    pos = match( substr( $0, from ), /Hello! ([0-9]+)/, val )
  }
}

Если шаблон должен совпадать при переводе строки, вам необходимо изменить разделитель входных записей - RS

0
ответ дан 5 December 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: