Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Regex 模式之间的正则表达式awk匹配,跳过endpat的第一次出现_Regex_Awk - Fatal编程技术网

Regex 模式之间的正则表达式awk匹配,跳过endpat的第一次出现

Regex 模式之间的正则表达式awk匹配,跳过endpat的第一次出现,regex,awk,Regex,Awk,我有个问题。我想匹配两种模式之间的线条,包括。我能做到。假设这就是我得到的: art subject Course Material paint brush easel beret art Skills learned oil pastel ink chalk math subject Course Material book calculator etc... 我将使用标准的awk'/^art/,/subject/”文件并获取 art subject art Skills

我有个问题。我想匹配两种模式之间的线条,包括。我能做到。假设这就是我得到的:

art
subject

Course Material
paint
brush
easel
beret

art

Skills learned
oil
pastel
ink
chalk


math
subject

Course Material
book
calculator
etc...
我将使用标准的
awk'/^art/,/subject/”文件
并获取

art 
subject

art

Skills learned
oil
pastel
ink
chalk


math
subject
这是我能做的最好的了。问题在于它将艺术描述分为两部分。我的问题是:

  • 如何使用第一场艺术比赛,跳过第一场专业比赛,然后使用第二场专业比赛

这将从
艺术
开始打印,直到找到下一个
主题

awk '/^art/{f=1;j=1;} f{print} /subject/{if(j)i++; if(i%2==0){f=0;j=0;}}' filename    #j is used as a flag.
输出:

art
subject

Course Material
paint
brush
easel
beret

art

Skills learned
oil
pastel
ink
chalk


math
subject

如果您不想打印
数学
主题
,@JonathanLeffler答案会更可取。

这段代码似乎可以正常工作,但我忍不住觉得创建更容易解析的输出格式会更好

script.awk
这段代码与示例数据有点太协调了。 “art<3”条件应为“art>0&&art<3”。您还希望能够选择关键字

BEGIN       { kw1 = "art"; kw2 = "subject" }
$1 ~ kw1    { print; nkw1++; next}
$1 ~ kw2    { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2) { print; nkw2++ } next }
            { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2) print }
扩展的
数据
文件 修订样本输出 修改后的脚本将只打印出第一个
art
块。如果文件中有其他此类块,则不会打印它们(但也不会打印多余的材料)

通过修改
BEGIN
块,检查
kw1
kw2
是否在命令行上设置,可以安排将关键字传递到脚本,例如:

awk -v kw1=art -v kw2=subject -f script.awk data

那么你想在输出中包含“课程材料”段落(用于“艺术”)吗?“数学”和“学科”的加入是可以接受的吗?是的。如果你使用正则表达式作为标记,它看起来就像这门艺术---[忽略第一个主题]---[忽略第二个艺术]----主题第一个艺术和第二个主题之间的一切。包含数学和主题是可以接受的,因为我无论如何都不知道如何做第一部分。wrt
我将使用标准的awk“/^art/,/subject/”文件
——这样的范围表达式不是任何东西的标准,应该避免使用标志,因为正如您刚刚发现的,它使琐碎的工作变得非常简短,但任何稍微有趣的事情都需要完全重写或复制条件。编辑您的问题,以显示所需的输出,我们可以帮助您。例如,我完全不知道您想要输出什么。请在我的“扩展<代码>数据文件”上尝试您的脚本。然后它不会产生所需的输出。就像我的第一个脚本一样,您的脚本与示例数据的协调有点过于精细。比我的脚本更简洁。“不想要主题”变量仍然打印下一个块的标题行(例如,“数学”行)。不过,我相信你也可以通过一点努力来消除这一点(也许是按照我上一个脚本中的“老”诀窍)。再次感谢你。我正在剖析它们,看看它们是如何工作的,以及如何使它们适应各种情况。太棒了!我一直在努力解决这个问题。我必须基本上通过4000个这样的搜索,每个搜索都有自己独特的“艺术”(即学术研究领域)到最后的“主题”,这是我唯一可以用作终点的常量。我已经决定使用NR作为一种方式,给我一个易于操作的数字范围。我已经阅读了O'Reilly的书籍和关于regex、awk、grep等的大量资源。但它们没有向您展示如何处理更复杂的regex搜索或如何为awk编程的语法。我开始使用python来解决这个问题,因为当我编写它时,它更透明,但awk速度快得令人眼花缭乱。所有的细节都是我通过艰苦的方式学到的,这让我保持警惕。AWK的语法基础是什么?你推荐什么书或资源?我喜欢它所能做的,但由于缺乏至少中级++级别的信息,我感到困难。O'Reilly关于
awk
sed
的书非常好。我不知道AWK(Aho,Weinberger,Kernighan)的书是否还有。另外,GNU
gawk
手册相当不错。获取Arnold Robbins的《有效的Awk编程》,第四版。所有其他awk书籍均已过期和/或不完整。Awk并不难使用,但它需要一个范式转换来学习如何正确使用它,就像从过程编程到面向对象编程一样。一旦它在你的大脑中点击,awk在内部为你做了多少工作,因此你需要编写多少代码来执行常见的文本处理操作,如读取一行并将其拆分为字段,这是一件轻而易举的事。谢谢大家的帮助!
BEGIN       { kw1 = "art"; kw2 = "subject" }
$1 ~ kw1    { print; nkw1++; next}
$1 ~ kw2    { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2) { print; nkw2++ } next }
            { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2) print }
BEGIN       { kw1 = "art"; kw2 = "subject" }
$1 ~ kw1    { old = $0; nkw1++; next}
$1 ~ kw2    { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2)
              { if (nkw2 == 0) print old; old = $0; nkw2++ }
              next
            }
            { if (nkw1 > 0 && nkw1 < 3 && nkw2 < 2) { print old; old = $0 } }
english
subject

Course material
To Kill a Mockingbird
To Set a Watchman
Huckleberry Finn
Tom Sawyer

english

Skills learned
comprehension
dialectical analysis

art
subject

Course Material
paint
brush
easel
beret

art

Skills learned
oil
pastel
ink
chalk


math
subject

Course Material
book
calculator
etc...
$ awk -f script.awk data
art
subject

Course Material
paint
brush
easel
beret
art

Skills learned
oil
pastel
ink
chalk


$
awk -v kw1=art -v kw2=subject -f script.awk data