【问题标题】:How to get the contents specified in the brackets?如何获取括号中指定的内容?
【发布时间】:2018-03-20 06:19:31
【问题描述】:

我想提取写入文件的内容。举个例子吧

{{{
      How 
      R 
      U
}}}

{{{ Hi }}}

我想像这样打印输出

 How
 R
 U

 Hi

【问题讨论】:

    标签: regex linux bash shell pattern-matching


    【解决方案1】:

    嗯,这不是regex 这是使用gawk 多字符RS

    awk -v RS='}}}|{{{' 'NF' inputfile
    
          How
          R
          U
    
     Hi
    

    您可以在上面的命令中使用类似sed -r 's/^ +//g'pipe 来删除行首的多余空格。

    【讨论】:

    • 默认awk 将每一行视为记录,\n 视为记录分隔符(RS)。这里我们强制 awk 将记录分隔符视为{{{}}}
    • 为什么使用管道以及 NF 的作用
    • 您可以尝试使用piping 和不使用pipingNF 表示字段数,它是 awk 的一种神秘方式,即只打印具有任何字段的行
    • 我可以单独打印 hi or how r u 吗
    • /Hi/替换NF以打印Hi
    【解决方案2】:

    通过使用正则表达式,这变得很棘手,主要是因为grepawk 似乎不支持lookahead

    要仅提取或匹配大括号内的文本,可以使用此正则表达式:https://regex101.com/r/ASFIFa/1

    [^{\}]+(?=})
    

    因此,您可以尝试ag - The Silver Searcher,这样会产生您所需的输出:

    $ ag -o '[^{\}]+(?=})' input.txt 
    

    删除前导空格:

    $ ag -o '[^{\}]+(?=})' input.txt | sed 's/^ *//'
    

    【讨论】:

      【解决方案3】:

      使用 sed

      sed '/{{{/!d;:A;/\}\}\}/!{N;bA};s/{{{//;s/}}}//;s/ *//g' infile
      

      或者

      sed -E '/\{{3}/!d;:A;/\}{3}/!{N;bA};s/\{{3}| *|\}{3}//g' infile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 2011-04-09
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        相关资源
        最近更新 更多