Awk:仅处理来自输入的文本块
我知道使用并非专门为HTML解析而设计的工具进行HTML解析是错误的。我这样做是为了学习和理解Awk 我有一个很大的HTML文件,其中有两个部分需要处理,其他部分对我来说并不重要。因此,我决定选择我将首先工作的部件。代码:Awk:仅处理来自输入的文本块,awk,Awk,我知道使用并非专门为HTML解析而设计的工具进行HTML解析是错误的。我这样做是为了学习和理解Awk 我有一个很大的HTML文件,其中有两个部分需要处理,其他部分对我来说并不重要。因此,我决定选择我将首先工作的部件。代码: cat ./txt.txt BBBBB BBBBB BBBBB section1 AAAAA1 AAAAA1 AAAAA1 end_section1 BBBBB BBBBB BBBBB section2 AAAAA2 AAAAA2 AAAAA2 end_section2 B
cat ./txt.txt
BBBBB
BBBBB
BBBBB
section1
AAAAA1
AAAAA1
AAAAA1
end_section1
BBBBB
BBBBB
BBBBB
section2
AAAAA2
AAAAA2
AAAAA2
end_section2
BBBBB
BBBBB
BBBBB
我正在尝试获得以下输出:
AAAAA1_1
AAAAA1_1
AAAAA1_1
AAAAA2_2
AAAAA2_2
AAAAA2_2
这只适用于一个块。据我所知,问题出在出口,因为Awk停止工作。
到目前为止,我还不知道如何独立处理文本块以及如何解决这个问题。也许有人能给我一个提示
通常,任务是独立地处理两个文本块和文件,并仅输出解析后得到的内容。如果有人能给我一个链接到一个好的Awk风格的代码,我也将不胜感激
Ed Morton编辑以显示在您要求时应用于代码的良好awk代码样式,并帮助使您的代码更易于理解。下面是使用gawk-o-…,打印代码的结果:
对脚本进行最小的更改以便于识别差异:
$ cat tst.awk
# First section
found1 {
if (/^end_section1$/) {
found1=0
}
else {
gsub(/^AAAAA1$/,"AAAAA1_1", $0)
print
}
}
/^section1$/ {
found1=1
}
# Second section
found2 {
if (/^end_section2$/) {
found2=0
}
else {
gsub(/^AAAAA2$/,"AAAAA2_2", $0)
print
}
}
/^section2$/ {
found2=1
}
以上假设不存在重叠或嵌套的范围,并且如果开始regexp匹配,则结束regexp也将出现在它之后。用nextI替换第一个出口自从您询问格式化提示以来,您的问题中添加了格式良好的代码版本。请您的问题包括一个简洁、可测试的示例输入和预期输出,以便我们可以帮助您。FWIW我不同意@karakfas建议,我认为当终止匹配发生时,您可能应该为每个块使用不同的标志,并将它们设置为零,但如果没有标记,我们都只是在猜测您可能想要什么。@EdMorton我添加了一个示例并剪切了脚本。不要继续添加到您的问题上,因为这只会让问题变得混乱,只需将问题包含1个版本的脚本,而不是3个,以及1个示例输入/输出集合,您需要我们考虑。
BEGIN {
print "addsomelong lines<link>" url "</link>"
}
# First block
# I will select the first block to work with, it starts with "main_page"
# and ends at the first entry of </section> string; for this block I need to apply one regular expression.
/main_page/ {
found = 1
}
found {
gsub(/<\/div>/, "123", $0)
gsub(/.*title>/, "1234", $0)
print
if (/<\/section>/) {
exit
}
}
# Second block
# I select the second block from the file and apply completely different regular expressions to it.
/<div class="items">/ {
found = 1
}
found {
gsub(/<\/div>/, "ABC", $0)
gsub(/.*title>/, "QWERTY", $0)
print
if (/publication/) {
exit
}
}
# Completing the work
END {
print "\nadd\nshort\nline"
}
$ cat tst.awk
# First section
found1 {
if (/^end_section1$/) {
found1=0
}
else {
gsub(/^AAAAA1$/,"AAAAA1_1", $0)
print
}
}
/^section1$/ {
found1=1
}
# Second section
found2 {
if (/^end_section2$/) {
found2=0
}
else {
gsub(/^AAAAA2$/,"AAAAA2_2", $0)
print
}
}
/^section2$/ {
found2=1
}
$ awk -f tst.awk txt.txt
AAAAA1_1
AAAAA1_1
AAAAA1_1
AAAAA2_2
AAAAA2_2
AAAAA2_2