bash заменить рекурсивно по регулярному выражению

Пытаюсь заменить все совпадения строк на пустоту все строки начинаются на $a= а заканчиваются на }?> между ними может быть любое количество любых символов (как я понимаю это *) набросал вот такую команду, но видимо я не правильно составил регулярное выражение.

find ./ -type f -print0 | xargs -0 sed -i 's/$a=*}?>/ /g'

Ответы (1 шт):

Автор решения: DiD

Вы, наверное, вот это имели в виду:

find ./ -type f | xargs sed -i -e "s/\\\$a=.*\\}\\?>//g"

Здесь:

  • \\\ означает первый \\ экранирует символ в строке \$;
  • . означает любой символ;
  • * означает количество повторений от 0 до бесконечности;
  • \\ экранирует символы в строке } и ?.

Пример:

% cat test.txt
---- начало файла -------
$a=         kjhkjgjhjhg    }?>
$a=   hgjg jgjh gjg jhg    }?>
$a=   g gh hgj hg jhg hg   }?>
---- конец файла --------

% find ./ -type f | xargs sed -i -e "s/\\\$a=.*\\}\\?>//g"

% cat test.txt
---- начало файла -------



---- конец файла --------
→ Ссылка