У меня есть текст типа:
... - hi- 12-
мой желаемый результат - иметь пробел между значениями буквенно-цифровой, которые заканчиваются на -
:
... - hi - 12 -
обратите внимание, что первый дефис остался на месте, так как ему предшествует пробел, а не буквенно-немурический.
также не следует изменять такие слова, как multi-line
.
вот что я использую:
echo " - hi- 12-" | sed -E 's/[[:alnum:]]-($|[^[:alnum:]])/ &/g'
который выводит:
" - h i- 1 2-"
есть ли способ, которым я мог бы использовать &+1
позицию?
@БенджаминВ. если дефис окружен alnum, ничего менять не надо. Группы захвата — это части внутри (...)
, верно? Я пробовал это: s/([[:alnum:]])-($|[^[:alnum:]])/\1 - /g'
но мне это кажется хакерским.
Вы не можете использовать &+1
, потому что мы никогда не можем быть уверены, что в позиции после текущего совпадения есть символ.
@WiktorStribiżew, ты имеешь в виду вообще? Потому что здесь я сопоставляю alnum, за которым следует дефис. Так что после него наверняка есть символ.
Нет, движок регулярных выражений не знает, есть ли символ после совпадения, пока он на самом деле не попытается это сделать.
Попробуйте sed -E 's/([[:alnum:]])-($|[^[:alnum:]])/\1 -\2/g'
@WiktorStribiżew Я не очень хорошо разбираюсь в группах захвата. Можете ли вы объяснить, что здесь делает \2
?
Группы захвата позволяют получить доступ к частям совпавшего текста. Я отправил ответ, пожалуйста, проверьте и дайте знать, что не ясно.
Вы можете использовать
sed -E 's/([[:alnum:]])-($|[^[:alnum:]])/\1 -\2/g' <<< " - hi- 12-"
# ^-- Group1--^ ^-- Group 2 ---^
См. онлайн демо
Подробности
([[:alnum:]])
- Группа захвата № 1: буквенно-цифровой символ-
- дефис($|[^[:alnum:]])
- Группа захвата № 2: конец строки или любой символ, кроме буквенно-цифрового.В RHS (шаблоне замены) заполнители \1
и \2
(или числовые обратные ссылки) относятся к тексту, захваченному соответствующими группами.
&
— это полное совпадение, вы хотели использовать\1
только для первой группы захвата? Кроме того, правило «слова типаmulti-line
не должны изменяться», что это такое? Вставить пробел, если за дефисом следует пробел? Например, ваше текущее правило будет вставлять пробел дляabc-.
.