给定一个包含行的文件 TestData.txt,其中垃圾可能会重复 N 次或更多次,并且“Model=Default”行的位置不固定
...
junk
junk
Model="C"
junk
junk
Size="81"
junk
Model="Default" <---- Start of "Default" block
junk
...
junk
Size="47" <---- Required value of size (first "Size=" line after "Default")
junk
junk
Model="A"
junk
Size="22"
junk
junk
Model="T"
junk
junk
Size="32"
junk
...
并希望提取默认情况下的 Size 值,以下工作通过打印匹配之间的行,然后应用第二个 sed 命令进行替换以提取 size 值。
sed -ne '/="Default"/,/Size=/p' TestData.txt | sed -ne 's|Size="\([1-9][0-9]*\)"|\1|p'
这打印47,“默认”部分中“大小”参数所需的值。
可以将两个 sed 操作组合成更高效的单个 sed 调用吗?
(这是实际任务的简化形式,即使用更复杂的正则表达式从配置文件中提取单个值,其中有多个包含“大小”指定的块。)
答案1
您应该能够添加第二个过滤器作为子表达式大括号之间
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p}' TestData.txt
或 POSIXly
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p
}' TestData.txt
[2addr] {function function ... }
仅当选择模式空间时才执行 sed 函数列表。 sed 函数列表应用大括号括起来并用换行符分隔,并符合以下规则。大括号前面或后面可以有空格。函数前面可以有空格,但后面不能有空格。右大括号前面应有换行符,并且前面或后面可以有空格。