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

Ezr*_*oss 1 regex sed gnu-sed

我已经查看了一些其他外围问题并且无法找到问题的解决方案,所以如果这与我错过的内容重复,我很抱歉.

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

sed -E -imr 's/^(\w)+/(\w)+$/g' file
Run Code Online (Sandbox Code Playgroud)

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

第一个正则表达式^(\w)+非常有效,并匹配每一行的第一个单词.问题是该命令用文字字符串替换了第一个单词(w)+$

我试图逃避反斜杠,括号,运算符,但我没有运气使正则表达式在命令的输出部分工作.

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

注意

我在brew安装的coreutils上使用了macOS上的GNU sed,所以这个问题的答案可能不适用于其他版本的sed,就像macOS上的本地BSD一样.

cho*_*oba 5

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

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"
Run Code Online (Sandbox Code Playgroud)

需要注意的是-r,\w\b所有可能无法正常工作sed的版本,但他们应该在sed最近GNU工作.