Regex 基于模式的直线合并

Regex 基于模式的直线合并,regex,awk,sed,Regex,Awk,Sed,您是否可以建议使用sed/awk命令合并文件中以图案开头、以括号结尾的行;匹配是可变行号的,并由右括号控制 例如,对于以下输入,提取模式以pattern1作为开始,以“}”结束 blah blah pattern1 { blah blah 1 blah blah 2 blah blah 3 } pattern1 { blah blah 1 blah blah 2 } 预期产量为 blah blah partern1 {blah blah 1 blah blah 2 blah blah 3}

您是否可以建议使用sed/awk命令合并文件中以图案开头、以括号结尾的行;匹配是可变行号的,并由右括号控制

例如,对于以下输入,提取模式以pattern1作为开始,以“}”结束

blah blah
pattern1 {
blah blah 1
blah blah 2
blah blah 3
}
pattern1 {
blah blah 1
blah blah 2
}
预期产量为

blah blah 
partern1 {blah blah 1 blah blah 2 blah blah 3}
partern1 {blah blah 1 blah blah 2}

这就解决了你在AWK中的问题,通过记录我们是否处于一个模式的中间,并作用于它。假设您的输入文件名为input.txt:

awk '/{/ {
    inPattern=1
}
{
    if (inPattern) {
        # When in a pattern, print the line (because of printf, this is without the newline).
        printf "%s ",$0;
    } else {
        # Otherwise, just print the line.
        print;
    }
}
/}/ {
    inPattern=0

    # Do this to go to a new line.
    print ""
}' input.txt
祝你好运

使用GNU时:

$ sed '/pattern1/ {:x; N; s/\n/ /; /}/! bx}' infile
blah blah
pattern1 { blah blah 1 blah blah 2 blah blah 3 }
pattern1 { blah blah 1 blah blah 2 }
说明:

如果要用变量替换
pattern1
,则必须以不同的方式引用:

$ var=pattern1
$ sed "/$var/ {:x; N; s/\n/ /; /}/! bx}" infile

这里有一个可移植的sed解决方案(适用于GNU sed、OSX、FreeBSD等),尽管它适用于所有模式,而不仅仅是匹配
/pattern1/
的部分:

sed -ne '/{/{;x;/}/d;p;x;h;d;}; /}/! {;H;d;}; /}/{;H;x;s/\n/ /g;};p' file
为了便于阅读,该脚本如下所示:

  • /{/{;
    -对于任何包含开口括号的行(
    {
    )。。。
    • x;/}/d;p;x;h;d;};
      -打印它..除非它是右括号,然后将它添加到我们的保留中
  • /}/!{;H;d;}-对于没有右括号的任何行,请将其附加到我们的保留中
  • /}/{;H;x;s/\n//g;}-对于任何带有右大括号的行,请附加它,交换保留空格和填充空格,并用换行符替换空格
  • p
    -并打印结果(因为我们有一个
    -n
    作为sed选项)
在您的测试输入数据上工作,我还没有在变体上测试它


请注意,如果模式中有嵌入的模式,那么这肯定会失败。要处理这种情况,您需要使用一种实际的语言,例如,它可以在嵌套层遍历您的文件时跟踪嵌套层。

这对我在OSX或FreeBSD中使用不起作用。您是否正在使用GNU sed?如果是这样的话,最好在你的答案中详细说明这一点,以便读者知道你的答案是不可移植的。@ghoti是的,我使用的是GNU sed。让我检查一下是否可以让它便携。@ghoti这么说,它使用
--posix
标志对我有效。什么对您不起作用?
sed:1:“/pattern1/{:x;N;s/\N…”:意外的EOF(挂起的})
是我在FreeBSD和OSX中看到的错误。起初我认为问题可能是您使用了
\n
,这也是不可移植的,但当我尝试运行
sed-e$'/pattern1/{;:x;n;s/\\\n/;/}时!bx;}'文件
,(带有额外的行分隔符),我得到了一个错误,
sed:2:“/pattern1/{;:x;N;s/…”:无效的命令代码;
。这里的内容比我现在调试的时间还多,所以..祝你好运。@ghoti可能是未替换的
。我不确定在没有访问FreeBSD/OSX sed的情况下是否可以正确调试此程序。不过,我会读一下便携式sed:)哦,而且
\n
不是便携式的吗?FreeBDS/OSX sed是否不符合POSIX?说明支持
\n
sed -ne '/{/{;x;/}/d;p;x;h;d;}; /}/! {;H;d;}; /}/{;H;x;s/\n/ /g;};p' file