谁能解释一下 sed 分组是如何工作的。我正在关注“Sed 和 Awk 101”一书。
这个概念对我来说看起来很神秘。
答案1
例子:
$ FOO="1234567890 one two three ABCDEF"
$ echo "$FOO" | sed "s|\(1.*0\).*\(A.*F\)|\2 \1|"
ABCDEF 1234567890
=> 告诉 SED 匹配\(1.*0\).*\(A.*F\)
并将其替换为group2 group1
团体声明的开头\(
和结尾为\)
\(1.*0\)
匹配除以“1”开头并以“0”结尾的任何模式,结果为组 1.*
匹配多个字符(任何类型)\(A.*F\)
匹配除以“A”开头并以“F”结尾的任何模式,结果为组 2
组可用于替换,例如替换为 \N,其中 N 是组号。
\1
是第 1 组,所以这里是“1234567890”\2
是第 2 组,所以这里是“ABCDEF”
答案2
分组是使用()
通常来稍后替换匹配的(正则表达式)部分来完成的。
使用基本正则表达式,应该()
转义 以获得特殊含义 ie \(stuff\)
。例如在
echo "Bash Pitfalls" | sed -E 's/Pit(falls)/\1/'
给你
Bash falls
注意-E
启用扩展正则表达式的使用所以我不必转义()
。
显然,这是 的使用不足()
,更实际的用法是将()
通配符和出现次数结合起来。
- 请注意,
{}
用于计算模式的出现次数。如果没有扩展的正则表达式,它们需要像\{\}
. - sed 中的内容
[]
是提及范围。例如,[0-9]
将匹配从 0 到 9 的数字、[a-z]
从 a 到 z 的任何字符等。
更多实际例子
$ echo "Match" | sed -E 's/([HM]{1}at)ch/\1/'
Mat
$ echo "Hatch" | sed -E 's/([HM]{1}at)ch/\1/'
Hat
$ echo "Catch" | sed -E 's/([HM]{1}at)ch/\1/'
Catch