Это должно быть регулярное выражение:
REGEX='\([^a-zA-Z0-9]\)'"${className%%:*}"'\([^a-zA-Z0-9]\)'
CHANGE="s/${REGEX}/\1${className##*:}\2/g"
При этом используются \( \)
и \1 \2
для воспроизведения совпадений до и после имени класса.
Кроме того, я рекомендую не использовать переменные всех заглавных букв, так как они могут конфликтовать с BASH переменными по умолчанию.
Если вам также необходимо сопоставить завершенные строки новой строки, вы можете добавить
REGEX='\([^a-zA-Z0-9]\)'"${className%%:*}"'\([^a-zA-Z0-9]\)'
CHANGE="s/${REGEX}/\1${className##*:}\2/g"
REGEXNL='\([^a-zA-Z0-9]\)'"${className%%:*}"'$'
CHANGENL="s/${REGEXNL}/\1${className##*:}/g"
и изменить sed
команда
sed -i -e "${CHANGE}" -e "${CHANGENL}"
Могу поспорить, что есть более элегантное решение, но этот sed
выдержал тест -posix
.