Using **GNU sed**, I try to replace first occurrence of pattern in file, but I don't want to replace if there is another pattern before the match.

For example, if the file contains line with "bird [number]" I want to replace the number with "0" if this pattern has no "cat" word any where before.

Example text

```
dog cat - fish bird 123
dog fish - bird 1234567
dog - cat fish, lion bird 3456

```

Expected result:

```
dog cat - fish bird 123
dog fish - bird 0
dog - cat fish, lion bird 3456

```

I try to combine [How to use sed to replace only the first occurrence in a file?](https://stackoverflow.com/questions/148451) and [Sed regex and substring negation](https://stackoverflow.com/questions/9053100) solutions and came up with something like

```
sed -E '0,/cat.*bird +[0-9]+/b;/(bird +)[0-9]+/ s//\10/'

```

where `0,/cat.*bird +[0-9]+/b;/(bird +)[0-9]+/` should match the first occurrence of `(bird +)[0-9]+` if the `cat.*bird +[0-9]+` pattern does not match, but I get

```
dog cat - fish bird 123
dog fish - bird 0
dog - cat fish, lion bird 0

```

The third line is also changed. How can I prevent it? I think it is related to address ranges, but I do not get it how to negate the second part of the address range.