【问题标题】:Regular expression to extract everything between braces in unix正则表达式提取unix中大括号之间的所有内容
【发布时间】:2013-06-20 16:30:17
【问题描述】:

我正在尝试从文本文件中提取大括号之间的所有内容并将输出写入另一个文本文件。我能够构造一个正则表达式来匹配 {} 之间的所有内容并且它工作正常(我编写了一个简单的 java 程序来测试它)但我在 unix 中不是很强大,因此不知道如何在 unix 中使用这个正则表达式。

下面的正则表达式匹配 {} 之间的所有内容(也适用于 jedit)

\{([^}]+)\}

我尝试了下面的 sed 命令,

cat samplefile | sed -e 's/.*\{\([^}]+\)\}.*/\1/g'

我收到以下错误。

sed: -e expression #1, char 24: Invalid preceding regular expression

在我找到一个匹配 [] 之间所有内容的正则表达式之间,它工作得很好。不知道我哪里出错了。有人可以帮我解决我的正则表达式问题吗?

cat file |sed -e 's/.*\[\([^]]*\)\].*/\1/g'

编辑 1:

解决方案:

cat file | sed -e 's/.*{\([^}]\+\)}.*/\1/g'  --> works

【问题讨论】:

    标签: regex unix sed grep


    【解决方案1】:

    你必须转义 + 量词

    【讨论】:

      【解决方案2】:

      我知道你已经解决了这个问题,但是大多数 机器都有一个 解释器,并且该语言有一个内置模块,可以用这种分隔符来解析文本,它是 @987654323 @。这里是一个测试:

      假设这个随机文本(取自问题:-),在花括号之间添加一些文本并保存为infile 文件:

      I am trying to extract {everything between braces} from a text file and 
      write the output to another text file. I was able to {construct a regular 
      expression} to match everything between {} and it works fine (I wrote a 
      simple {java program} to test it) but I not {very strong} in unix hence not 
      sure how to use this regular expression in unix.
      

      程序script.pl

      #!/usr/bin/env perl
      
      use warnings;
      use strict;
      use Text::Balanced qw<extract_bracketed>;
      
      my $str = do { undef $/; <> };
      
      while ( my @result = extract_bracketed( $str, '{}', '[^{]*' ) ) { 
          last unless defined $result[0];
          $result[0] =~ s/\n//g;
          $result[0] = substr $result[0], 1, length( $result[0] ) - 2;
          printf qq|%s\n|, $result[0];
      }
      

      在一个变量中读取整个文件并解析它以寻找一对花括号,因为每个循环都保存在数组的第一个位置@result其中的文本,所以然后我删除任何换行符,前导和尾随花括号并打印出来。

      像这样运行它:

      perl script.pl infile
      

      产生:

      everything between braces
      construct a regular expression
      
      java program
      very strong
      

      请注意,它会正确解析第三行中的空白对。还有其他在其中包含换行符(第二行)并且在同一行中有多个时,例如在第四行中。

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多