Each CLONE call is an independent action; setting multi_match = 1 will not affect future calls.
COPY_EXISTING_REGEXP GLOB ~.*\.spl~ ~override~
LPF CLONE_EFFECT INT_VAR match_opcode=206 multi_match = 1 STR_VAR resource=~lowspell~ END
LPF CLONE_EFFECT INT_VAR match_opcode=206 multi_match = 1 STR_VAR resource=~highspell~ END
The first CLONE runs, finds the first 206, makes one copy, and stops. The second CLONE runs, finds the first 206, makes one copy, and stops. Now you have the original 206, one for highspell, and one for lowspell. Alternatively
COPY_EXISTING_REGEXP GLOB ~.*\.spl~ ~override~
LPF CLONE_EFFECT INT_VAR match_opcode=206 STR_VAR resource=~lowspell~ match_resource = ~originalspell~ END
LPF CLONE_EFFECT INT_VAR match_opcode=206 STR_VAR resource=~highspell~ match_resource = ~originalspell~ END
Now it runs, finds the existing spell protection, makes a clone for lowspell. The second one runs, ignores the new 206 for lowspell, finds the original 206, and clones it into a new 206 for highspell.
Both ways end up with the original 206, one for lowspell, and one for highspell.
If you're doing a ton of these, probably the best way would be to simply make an array of new_spell => original and then iterate through it with PHP_EACH. E.g.
ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_map_newspells BEGIN
low_aid=> sppr201
high_aid=> sppr201
low_ani=> sppr301
high_ani=> sppr301
END
COPY_EXISTING_REGEXP GLOB ~.*\.spl~ ~override~
~.*\.itm~ ~override~
~.*\.cre~ ~override~
PHP_EACH cd_map_newspells AS new => old BEGIN
PATCH_FOR_EACH op IN 206 318 321 324 BEGIN
LPF CLONE_EFFECT INT_VAR match_opcode = op STR_VAR resource = EVAL ~%new%~ match_resource = EVAL ~%old%~ END
END
END
BUT_ONLY
edit: missing a BEGIN