【问题标题】:How to print everything inside [] only?如何仅打印 [] 内的所有内容?
【发布时间】:2013-03-20 18:58:45
【问题描述】:

在一些文本文件中有很多[with text inside]。我只想打印括号内的任何内容。括号的数量是文件是未知的,每个要解析的文件都不同。

我尝试用sed 解析它,但做不到。

【问题讨论】:

  • 你能举个例子吗?
  • 每行是否有多个[]?它们是否跨越多条线?你试过的sed在哪里?
  • 每行不止一个,跨越多行。 sedcat file | sed 's/.*\[\([^]]*\)\].*/\1/' 开头,但它显然不适用于每行超过一对括号。

标签: regex perl parsing sed awk


【解决方案1】:

使用 GNU grep

grep -oP '(?<=\[)[^]]*'

对左括号使用正向后视,匹配所有非右括号字符。 示例:

$ echo 'foo [bar] baz [hello world]' | grep -oP '(?<=\[)[^]]*'
bar
hello world

【讨论】:

    【解决方案2】:
    perl -nE'say for /\[( [^\[\]]* )\]/xg;'
    

    或者如果内容可以跨行。

    perl -0777nE'say for /\[( [^\[\]]* )\]/xg;'
    

    您可以将文件名作为参数传递,也可以使用 STDIN。

    【讨论】:

      【解决方案3】:

      您也可以尝试:

      awk 'NR>1{print $1}' RS=\[ FS=\] file
      

      例如

      $ printf 'First part of foo [bar] not present, ["hello" can be\non a different\nline from "world" ] inside  brackets\n' |
      awk 'NR>1{print $1}' RS=\[ FS=\]
      bar
      "hello" can be
      on a different
      line from "world"
      $
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed ':a;/\[/!d;/\]/!{$!N;s/\n/ /;ba};s/[^[]*\[\([^]]*\)\]/\1\n/;P;D' file
        

        注意它将[...] 中的换行符替换为空格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-08
          • 1970-01-01
          • 2019-03-11
          • 2012-03-25
          • 2015-12-20
          • 1970-01-01
          • 1970-01-01
          • 2011-07-07
          相关资源
          最近更新 更多