Регулярное выражение в sed

Мне нужно использовать sed для преобразования всех вхождений ## XXX ## в ${XXX}. X может быть любым алфавитным символом или "_". Я знаю, что мне нужно использовать что-то вроде:

's/##/\${/g'

Но, конечно, это будет неправильно, поскольку оно преобразует ## FOO ## в ${FOO ${

Любые берущие? - Дон

Ответ 1

Здесь снимок с лучшим регулярным выражением замены:

's/##\([a-zA-Z_]\+\)##/${\1}/g'

Или если вы принимаете ровно три символа:

's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'

Ответ 2

  • Инкапсулируйте альфу и '_' внутри '\ (' и '\)', а затем в правой части ссылки, которая с '\ 1'.
  • '+' для соответствия одной или нескольким альфам и '_' (в случае, если вы видите ####).
  • Добавьте параметр "g" в конец, чтобы заменить все совпадения (что я предполагаю, это то, что вы хотите сделать в этом случае).
's/##\([a-zA-Z_]\+\)##/${\1}/g'

Ответ 3

Используйте это:

s/##\([^#]*\)##/${\1}/

Кстати, нет необходимости выходить из $в правой части оператора s.

Ответ 4

sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'

\(...\) запоминает... и упоминается как \1 в расширении. Используйте одиночные кавычки, чтобы сэкономить ваше здоровье.

Как отмечено в комментариях ниже, это также может быть сокращено до:

sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'

В этом ответе предполагается, что в примере требуется ровно три символа. В зависимости от того, что находится между метками хэша, существует несколько вариантов. Ключевая часть запоминает часть согласованной строки.

Ответ 5

echo '## XXX ##' | sed "s/^ ## ([^ #] *)/## ${\ 1}/g"

Ответ 6

sed 's/([^ a-z] [^ A-Z] [^ 0-9] *)/(&)/pg

Ответ 7

echo "##foo##" | sed 's/##/${/;s//}/'
  • s по умолчанию изменяется только 1 событие
  • s// использовать последний шаблон поиска, так что секунда s также принимает ##, и остается только второе появление