Замените одну группу захвата на другую с помощью 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.

Другие вопросы по тегам