在sed中解释模式s / \(b \?\) - / x \ u \ 1 / g

时间:2017-06-01 02:22:27

标签: sed expression

给予sed的内容如下:

A-B -

下面尝试了sed语法;

s/\(b\?\)-/x\u\1/g

第三个是输出

axxB

我想知道它是如何匹配的。我无法理解'b \?'。这是什么意思?请问 '\?'只是意味着'?'

1 个答案:

答案 0 :(得分:1)

s/regex/replacement/g是你命令的基本结构,你可以在这里阅读:

man sed | sed -n '/^\s\{7\}s\//,/exp.$/p'

由于sed读取行是行,因此可以选择g选项,您可以将其附加到s///,以便匹配行中regex的每个出现位置而不仅仅是第一个。这就是为什么你有:
s/regex/replacement/g

您的regex

如果您在man sed中阅读了上面的提示,您会注意到可以对替换进行分组。如果你想要那个,你需要regex中的一个组和一个组\(\)的语法,至少你必须注意到必须使用普通的反斜杠转义元字符{{1} }。

在你的正则表达式组中,你正在寻找的角色\因为给定的重复b而最多只能匹配一次,\?也必须被重叠,只是\{0,1\}的简短形式{ {1}}。

正则表达式中的最后一个字符是短划线-

所以,您正在寻找\(b\?\)-,一个零或一个b和短划线的群组。

您的replacement

可以在替换中使用反斜杠引用正则表达式的组,后跟组的编号。这是您的\1

当您使用GNU sed时,您的扩展程序\u会将下一个字符转换为大写字母。你可以在这里阅读:3.3 The s Command

所以,在将你的正则表达式组替换到最后并将其转换为大写字母后,你最终会替换每个短划线,因为g中的s///标志与普通字符一致x

所以你的替换是x\u\1

这就是为什么你有:

$ echo "a-b-" | sed 's/\(b\?\)-/x\u\1/g'
axxB