给予sed的内容如下:
A-B -
下面尝试了sed语法;
s/\(b\?\)-/x\u\1/g
第三个是输出
axxB
我想知道它是如何匹配的。我无法理解'b \?'。这是什么意思?请问 '\?'只是意味着'?'
答案 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