Замените одну группу захвата на другую с помощью GNU sed (macOS) 4.4
Я просмотрел некоторые второстепенные вопросы и не смог найти решение своей проблемы, поэтому извините, если это дубликат того, что я пропустил.
По сути, у меня есть следующая команда GNU sed:
sed -E -imr 's/^(\w)+/(\w)+$/g' file
который должен заменить первое слово строки последним словом строки.
Первое регулярное выражение ^(\w)+
отлично работает и соответствует первому слову каждой строки. Проблема в том, что команда заменяет это первое слово на буквальную строку (w)+$
Я пытался избежать обратной косой черты, скобок, операторов, но мне не повезло, чтобы регулярное выражение работало в выходной части команды.
Можно ли использовать группу захвата регулярных выражений, чтобы заменить другую группу захвата регулярных выражений? Что нужно избежать, или какой альтернативный синтаксис нужно использовать?
НОТА
Я использую GNU sed на macOS из установленного brew coreutils, поэтому ответы на этот вопрос могут не работать в других версиях sed, например, в BSD на macOS.
1 ответ
Замена не содержит регулярное выражение, она содержит строку, которая может ссылаться на группы захвата, определенные в регулярном выражении. Чтобы заменить первое слово последним, вам нужно захватить последнее слово и остаток строки:
sed -r 's/^\w+(.*\b)(\w+)$/\2\1/'
| | |
Matches | |
the 1st | Matches the last word
word |
Matches everything in the middle
up to a "word boundary"
Обратите внимание, что -r
, \w
, а также \b
может не работать во всех sed
версии, но они должны работать в последних GNU sed.