如何打印文本文件中的多个部分?

如何打印文本文件中的多个部分?

我有一个如下所示的文本文件:

*FILESTART
line_a
line_b
line_c
*INCLUDE
file_A.key
file_B.key
*INCLUDE
file_1.key
file_2.key
file_3.key
*SOMETHING_ELSE
line_x
line_y
line_z
*END

我只想打印每个 *INCLUDE 语句和接下来的星号语句之间的行,在本例中为以下内容:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

.key 文件的数量可能有所不同,且名称并不总是以 .key 结尾。

该代码将在现有的 bash 脚本中实现,因此它应该基于 awk、sed 或其他“bash 风格”的脚本,而不是 Perl、PHP、Python 等。

我尝试过类似的事情

sed -n '/^*INCLUDE/,/^\*/p' 

但它只打印第一部分并以第二行 *INCLUDE 结束。

有什么建议么?

答案1

sed在这种情况下不起作用,因为*INCLUDE模式范围的第二个转弯,并且永远不会再次打开。我认为使用会更容易awk,例如,您可以使用这样的打印标志:

awk '/^\*/ { f=0 } /^\*INCLUDE/ { f=1; next } f' file

输出:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

解释

  • f==1最后一条语句(即唯一的语句f)调用默认规则时{print $0}
  • f0每当行以星号开头时,就会设置为。
  • f1每当行以 开头时,就会设置为*INCLUDE。根据要求,这些行也会被跳过。

答案2

我使用 rexx 脚本来做这种事情。本质上,您使用脚本根据 *include 到 *end 的存在来“打开或关闭回显”...

一些精明的编程技巧可以让你把输出写入内存,并将其作为批处理文件运行,并完成子例程和字符串替换。这实际上是 Don Knuthweave程序的本质。你在同一个文件中编写文档和程序,然后将程序提取为输出。

相关内容