SED, GREP, AWK, регулярное выражение не отображают содержимое между двумя шаблонами, содержащими и совпадающими со строкой внутри второго шаблона вхождения

#awk #sed #grep

Вопрос:

Есть ли способ не отображать блок между двумя шаблонами, когда он соответствует строке внутри блока и соответствует только 2-му вхождению второго шаблона?

пример :

 test, test-xxx-a2, Deployment (apps) has changed:
...
-               value: 4.x.x
                value: x.3.x
...
test, test-xxxio-3, Deployment (apps) has changed:
...
-   replicas: 3
    replicas: 5
...

test, test-xxx-xxx, Deployment (apps) has changed:
...
-               value: x.2.x
                value: x.x.x
...
test, test-xxxio-1, Deployment (apps) has changed:
...
-   replicas: 3
    replicas: 5
...

test, test-xxxio-4, Deployment (apps) has add:
...

text...

...

test, test-xxx-test2, Deployment (apps) has changed:
...
-   replicas: 3
    replicas: 2
...
text, text-123-xxx, Deployment (apps) has changed:
...
-   replicas: 1
    replicas: 2
...
-               value: 2.1.0
                value: 42.4.0
...
 

Желание выхода:

 test, test-xxx-a2, Deployment (apps) has changed:
...
-               value: 4.x.x
                value: x.3.x
...

test, test-xxx-xxx, Deployment (apps) has changed:
...
-               value: x.2.x
                value: x.x.x
...

test, test-xxxio-4, Deployment (apps) has add:
...

text...

...
text, text-123-xxx, Deployment (apps) has changed:
...
-               value: 2.1.0
                value: 42.4.0
...
    
 

первый образец: changed:

второй шаблон: ... (только второй)

строка, содержащая: replicas

регулярное выражение, над которым я работаю https://regex101.com/r/FTGBxG/1, но, конечно, это не мое выходное желание.

Комментарии:

1. Конец вашего образца ввода, похоже, испорчен, посмотрите и исправьте это.

Ответ №1:

 $ awk -v ORS= '
    { buf = buf $0 RS }
    ($0 == "...") amp;amp; ((  sepCnt % 2) == 0) {
        if ( buf !~ /replicas/ ) {
            print buf
        }
        buf=""
    }
' file
test, test-xxx-a2, Deployment (apps) has changed:
...
-               value: 4.x.x
                value: x.3.x
...

test, test-xxx-xxx, Deployment (apps) has changed:
...
-               value: x.2.x
                value: x.x.x
...

test, test-xxxio-4, Deployment (apps) has add:
...

text...

...
 

Комментарии:

1. Это очень хорошее решение короче моего

Ответ №2:

Вы можете использовать этот awk скрипт:

 cat filter.awk

index($0, "Deployment (apps)") {
   p = 1
   s = ""
   num3dots = 0
}

p {s = s $0 ORS}

index($0, "...") == 1 amp;amp;   num3dots == 2 {
   if ( s !~ /changed:.* replicas/ )
      printf "%s", s
   p = 0
}
 

Затем используйте его как:

 awk -f filter.awk file

test, test-xxx-a2, Deployment (apps) has changed:
...
-               value: 4.x.x
                value: x.3.x
...
test, test-xxx-xxx, Deployment (apps) has changed:
...
-               value: x.2.x
                value: x.x.x
...
test, test-xxxio-4, Deployment (apps) has add:
...

text...

...
 

Комментарии:

1. Хорошая мысль, Эд. Теперь я все исправил.