Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk:仅处理来自输入的文本块_Awk - Fatal编程技术网

Awk:仅处理来自输入的文本块

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

我知道使用并非专门为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
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