我有一个如下所示的文本文件:
*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}
。 f
0
每当行以星号开头时,就会设置为。f
1
每当行以 开头时,就会设置为*INCLUDE
。根据要求,这些行也会被跳过。
答案2
我使用 rexx 脚本来做这种事情。本质上,您使用脚本根据 *include 到 *end 的存在来“打开或关闭回显”...
一些精明的编程技巧可以让你把输出写入内存,并将其作为批处理文件运行,并完成子例程和字符串替换。这实际上是 Don Knuthweave
程序的本质。你在同一个文件中编写文档和程序,然后将程序提取为输出。