Ответ 1
Здесь снимок с лучшим регулярным выражением замены:
's/##\([a-zA-Z_]\+\)##/${\1}/g'
Или если вы принимаете ровно три символа:
's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
Мне нужно использовать sed для преобразования всех вхождений ## XXX ## в ${XXX}. X может быть любым алфавитным символом или "_". Я знаю, что мне нужно использовать что-то вроде:
's/##/\${/g'
Но, конечно, это будет неправильно, поскольку оно преобразует ## FOO ## в ${FOO ${
Любые берущие? - Дон
Здесь снимок с лучшим регулярным выражением замены:
's/##\([a-zA-Z_]\+\)##/${\1}/g'
Или если вы принимаете ровно три символа:
's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
's/##\([a-zA-Z_]\+\)##/${\1}/g'
Используйте это:
s/##\([^#]*\)##/${\1}/
Кстати, нет необходимости выходить из $в правой части оператора s.
sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'
\(...\)
запоминает... и упоминается как \1
в расширении. Используйте одиночные кавычки, чтобы сэкономить ваше здоровье.
Как отмечено в комментариях ниже, это также может быть сокращено до:
sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'
В этом ответе предполагается, что в примере требуется ровно три символа. В зависимости от того, что находится между метками хэша, существует несколько вариантов. Ключевая часть запоминает часть согласованной строки.
echo '## XXX ##' | sed "s/^ ## ([^ #] *)/## ${\ 1}/g"
sed 's/([^ a-z] [^ A-Z] [^ 0-9] *)/(&)/pg
echo "##foo##" | sed 's/##/${/;s//}/'
s
по умолчанию изменяется только 1 событиеs//
использовать последний шаблон поиска, так что секунда s также принимает ##
, и остается только второе появление