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

时间:2017-07-01 21:02:18

标签: regex sed gnu-sed

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

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

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

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

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

替换了第一个单词

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

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

我在brew安装的coreutils上的macOS上使用GNU sed,因此这个问题的答案可能不适用于其他版本的sed,就像macOS上的本机BSD一样。

1 个答案:

答案 0 :(得分: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"

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