Bash Замена строки SED - удаляет символы до и после регулярных выражений - PullRequest
0 голосов
/ 23 марта 2020

У меня есть этот простой bash (3) скрипт для сканирования всех файлов в каталоге и замены некоторых старых CSS классов новыми.

export LC_ALL=C

ARRAY=(
    "a-oldclass:new-class"
    "m-oldclass:new-class"
)

for className in "${ARRAY[@]}" ; do
    REGEX=[^a-zA-Z0-9]${className%%:*}[^a-zA-Z0-9]
    CHANGE="s/${REGEX}/${className##*:}/g"

    find src -type f -exec sed -i '' "${CHANGE}" '{}' +
done

Это комбинация клавиш : пары значений и регулярное выражение. Проблема в том, что он также удаляет специальные символы до и после соответствующего шаблона, например:

class="a-oldclass" => class=new-class (Quotes are gone)

class=" a-oldclass " => class="new-class" (spaces are gone)

Мне нужен этот результат:

class="a-oldclass m-oldclass" => class="new-class new-class".

[^a-zA-Z0-9] необходимо избегать этого сценария: я хочу заменить a-oldclass на new-class, но я не хочу касаться класса data-oldclass. Поскольку эта строка содержит a-oldclass, она будет изменена. Так что с [^a-zA-Z0-9] я исключаю этот вид сценария ios.

1 Ответ

2 голосов
/ 23 марта 2020

Это должно быть регулярное выражение:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...