我想从文件中打印一个中间部分(在开始模式和结束模式之间),特定的行会变色。
这是一个此类文件中的示例文本
## Beginning of file
Some text and code
## FAML [ASMB] KEYWORD
## Some information.
## Some other text.
## Blu:
## Some text in blue.
## END OF FAML [ASMB]
## Other text
More text and code
## FAML [ASMB] KEYWORD
和之间的文本## END OF FAML [ASMB]
将被提取(没有开头)并传递给将适当打印多行文本的##
函数。luciferin
块之间的文本被丢弃。后续块的工作方式相同,通过调用函数提取并打印中间区域luciferin(rec)
。该函数luciferin
以彩色输出。
输入字符串luciferin
为
Some information.
Some other text.
Blu:
Some text in blue.
这是捕获中间区域的 awk 脚本
BEGIN {
beg_ere = "## [[:alnum:]]+ [[][[:alnum:]]+[]]"
end_ere = "## END OF [[:alnum:]]+ [[][[:alnum:]]+[]]"
}
match($0, beg_ere, paggr) { display = 1 }
$0 ~ end_ere { display = 0 ; next }
display { print }
这是一个luciferin
函数,它接受一个字符串来输出颜色。cpt
在颜色转义序列中,并且是多行输入字符串的astr[i]
特定行。i
function luciferin(mstr) {
cpt = tseq["Grn:"]
nlines = split(mstr, astr, "\n")
for (i = 1; i <= nlines; i++) {
for ( knam in tseq ) {
if ( knam == astr[i] ) { cpt = tseq[knam] ; break }
}
if (knam == str) { print "" } else { print cpt astr[i] rst }
}
}
解决这个问题
awk
当然是可行的,但你似乎对自己太过苛刻了。Perl
直接为此类范围提供语言支持,复制sed
自评论中提到的功能。让我们把春天的月份涂成蓝色。
在这些正则表达式中使用 FAML / ASMB 关键字以使其适应您的用例。
即使您希望进行比这更高级的处理,它仍然是您管道中的一个很好的初始阶段。
现在后续阶段不必担心行范围;它可以使用第一个字段来确定我们是否在范围内,然后相应地处理该行的其余部分。
由于既没有最小的完整代码示例,也没有足够的样本输入/输出来测试,这显然只是一个未经测试的猜测,但看起来你应该改变:
到
和
到
或类似的并进行调整
luciferin
以在打印之前从它的 arg 中删除额外的尾随换行符。关于如何改进问题和一般的 OPs 问题——这是一个完整的、最小的代码示例在这样的问题中的样子:
和一些样本输入来证明您的需求并测试:
以及给定该输入的预期输出:
您的真实代码进行着色或其他任何事情的事实与您需要帮助的问题完全无关,这只是如何存储文本块并调用以某种方式修改打印
luciferin()
它。给出一个清晰、简单的例子,我们可以很快地向您展示一个解决方案,例如:
然后你可以拿走它并将其中的概念应用到你的真实代码中。