使用 GNU sed (macOS) 4.4 将一个捕获组替换为另一个捕获组

Replace one capture group with another with GNU sed (macOS) 4.4

我查看了其他一些外围问题,但未能找到解决我的问题的方法,所以如果这与我遗漏的问题重复,我深表歉意。

基本上,我有以下 GNU sed 命令:

sed -E -imr 's/^(\w)+/(\w)+$/g' file

应该用该行的最后一个单词替换一行的第一个单词。

第一个正则表达式 ^(\w)+ 效果很好,匹配每行的第一个单词。问题是该命令将第一个单词替换为文字字符串 (w)+$

我尝试转义反斜杠、圆括号、运算符,但我没有成功地让正则表达式在命令的输出部分工作。

能否使用正则表达式捕获组来替换不同的正则表达式捕获组?需要转义什么,或者需要使用什么替代语法?

注意

我在 macOS 上使用来自 brew 安装的 coreutils 的 GNU sed,所以这个问题的答案可能不适用于其他版本的 sed,比如 macOS 上的本机 BSD。

替换不包含正则表达式,它包含一个可以引用正则表达式中定义的捕获组的字符串。要用最后一个单词替换第一个单词,您需要捕获最后一个单词和该行的其余部分:

sed -r 's/^\w+(.*\b)(\w+)$//'  
            |    |    |
         Matches |    |
         the 1st |    Matches the last word
         word    |
                Matches everything in the middle
                up to a "word boundary"

请注意,-r\w\b 可能不适用于所有 sed 版本,但它们应该适用于最新的 GNU sed。