1

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

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

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

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

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

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

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

笔记

我在 macOS 上使用来自 brew installed coreutils 的 GNU sed,因此这个问题的答案可能不适用于其他版本的 sed,例如 macOS 上的本机 BSD。

4

1 回答 1

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 中使用。

于 2017-07-01T21:09:53.907 回答