Sed中分组的工作流程

Sed中分组的工作流程

谁能解释一下 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 

相关内容