在 sed 分组命令中引用范围的第一行和最后一行

在 sed 分组命令中引用范围的第一行和最后一行

当您在 sed 脚本中使用分组命令时,有没有办法引用您所在范围的第一行和最后一行?

我希望能够打印范围的第一行和最后一行以及它们之间的选定行。

#n
/StartLinePattern/,/EndLinePattern/{
  /PatternOfSubLineToPrint/p;
}

我知道我可以通过包含另一个分组命令来解决这个问题火柴范围的第一行和最后一行(再次);但执行类似于非分组命令标准的操作会更干净、更快、更可重用。

1p;$p

我尝试将上述内容包含在组中,但它不起作用。看来1$是绝对的,与您所在的范围无关。

背景

我制作了一个 sed 脚本,用于从 XML 文件中过滤元素。为此,我使用带有分组命令的范围来打印该范围内的某些子元素。因此,该脚本的工作原理是打印您想要保留的所有内容。

#n
/<Parent\>/,<\/Parent>/{
  /<Child1\>/,/<\/Child1>/p;
  /<Child2\>/,/<\/Child2>/p;
  /<SingleLineChild\>/p;
}

答案1

你可以通过使用来做到这一点空正则表达式//作为开头后的第一个正则表达式{
,例如输入如下:

hello
world
start
inner1
inner2
inner3
end
outer

如果你跑

sed -n '/start/,/end/{
//p
/inner1/p;/inner3/p
}' infile

它打印

start
inner1
inner3
end

你可以看到这是如何运作的...只是重新发布重要部分:

当 aREGEX为空(即//)时sed,就像REGEX指定了最后应用的最后一个命令中使用的最后一个(作为地址或作为替代命令的一部分)。


如果您想排除范围的开头或结尾,您只需添加另一个测试:

sed -n '/start/,/end/{
//{
/start/!p
}
/inner1/p;/inner3/p
}' infile

相关内容