gpt4 book ai didi

awk 和多行匹配(子正则表达式)

转载 作者:行者123 更新时间:2023-12-04 17:37:42 26 4
gpt4 key购买 nike

我正在尝试使用 awk 来解析多行表达式。其中一个看起来像这样:

_begin  hello world !
_attrib0 123
_attrib1 super duper
_attrib1 yet another value
_attrib2 foo
_end

我需要提取与 _begin 和 _attrib1 关联的值。所以在这个例子中,awk 脚本应该返回(每行一个):
hello world ! super duper yet another value 

使用的分隔符是制表符 (\t) 字符。空格仅在字符串中使用。

最佳答案

以下 awk 脚本完成了这项工作:

#!/usr/bin/awk -f
BEGIN { FS="\t"; }
/^_begin/ { output=$2; }
$1=="_attrib1" { output=output " " $2; }
/^_end/ { print output; }

您没有指定是否要使用制表符 ( \t ) 作为输出字段分隔符。如果你这样做,请告诉我,我会更新答案。 (或者你可以;这是微不足道的。)

当然,如果你想要一个可怕的替代方案(因为我们离万圣节越来越近了),这里有一个使用 sed 的解决方案。 :
$ sed -ne '/^_begin./{s///;h;};/^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;};/^_end/{;g;p;}' input.txt 
hello world ! super duper yet another value

这是如何运作的? Mwaahahaa,我很高兴你问。
  • /^_begin./{s///;h;}; -- 当我们看到_begin ,将其剥离并将该行的其余部分存储到 sed 的“保持缓冲区”。
  • /^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;}; -- 当我们看到_attrib1 ,将其剥离,将其附加到保持缓冲区,交换保持缓冲区和模式空间,用空格替换换行符,然后再次交换保持缓冲区和模式空间。
  • /^_end/{;g;p;} -- 我们已经到了最后,所以将保持缓冲区拉入模式空间并打印它。

  • 这假设您的输入字段分隔符只是一个选项卡。

    很简单。谁说过 sed是奥术?!

    关于awk 和多行匹配(子正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144464/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com