sed - 通过从与第一个正则表达式找到的第二个正则表达式匹配的第一行中替换来提取值

sed - 通过从与第一个正则表达式找到的第二个正则表达式匹配的第一行中替换来提取值

给定一个包含行的文件 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

在 sed 中编辑命令

[2addr] {function
function
...
}

仅当选择模式空间时才执行 sed 函数列表。 sed 函数列表应用大括号括起来并用换行符分隔,并符合以下规则。大括号前面或后面可以有空格。函数前面可以有空格,但后面不能有空格。右大括号前面应有换行符,并且前面或后面可以有空格。

相关内容