使用awk或sed删除txt中的模式

使用awk或sed删除txt中的模式,awk,sed,Awk,Sed,我试图从一些文本中删除一个模式。我的意思是: 从[1426467605000,19.44]到19.44 这是我的输入文本文件: [1426467605000,19.44],[1426467965000,19.44],[1426468325000,19.38],[1426468685000,19.38],[1426469045000,19.38],[1426469405000,19.38],[1426469764000,19.38],[1426470124000,19.38],[142647048

我试图从一些文本中删除一个模式。我的意思是:

[1426467605000,19.44]
19.44

这是我的输入文本文件:

[1426467605000,19.44],[1426467965000,19.44],[1426468325000,19.38],[1426468685000,19.38],[1426469045000,19.38],[1426469405000,19.38],[1426469764000,19.38],[1426470124000,19.38],[1426470484000,19.38],[1426470845000,19.31],[1426471205000,19.31],[1426471565000,19.31],[1426471925000,19.31],[1426472285000,19.31],[1426472645000,19.31],[1426473005000,19.31],[1426473365000,19.31],[1426473725000,19.31],[1426474085000,19.31],[1426474445000,19.25],[1426474805000,19.25],[1426475164000,19.25],[1426475524000,19.25],[1426475884000,19.55],[1426476245000,19.25],[1426476605000,19.25],[1426476965000,19.25],[1426477325000,19.25],[1426477685000,19.19],[1426478045000,19.19],[1426478405000,19.19],[1426478764000,19.19],[1426479124000,19.19],[1426479484000,19.19],[1426479844000,19.19],[1426480204000,19.13],[1426480564000,19.13],[1426480924000,19.19],[1426481284000,19.19],[1426481644000,19.19],[1426482005000,19.19],[1426482365000,19.19],[1426482725000,19.19],
这是我想要的输出:

19.44
19.44
19.38
19.38
19.38
etc.

您可以使用
grep

$ grep -oP ',\K[^\]\[]*(?=\])' file
19.44
19.44
19.38
19.38
19.38
19.38
19.38
19.38
这个正则表达式将获取方括号内的最后一个字符串

  • 匹配第一个逗号
  • \K
    丢弃先前匹配的字符逗号
  • [^\]\[]*
    与任何字符(但不是
    ]
    [
    的字符)匹配的求反字符类,零次或多次
  • (?=\])
    正向前瞻,断言匹配后必须跟一个
    ]
    字符

    • 使用
      grep

      grep -oE '[0-9]+\.[0-9]+' file
      
      模式搜索一个或多个数字,后跟一个点,然后再搜索一个或多个数字

      -o
      使grep只输出匹配项,而不是匹配项出现的整行
      -E
      允许我们使用posix扩展正则表达式,这样我们就不用逃避
      +


      另一种方法是像这样使用
      awk

      awk -F, '{print $2}' RS='\\[|\\],|\\],\\[' file
      
      此命令执行更具语义的分析,它从记录返回第二个值。它通过
      [
      (行首)或
      ]、
      ]、[
      分隔记录。它打印记录的第二个字段,其中字段由
      分隔

      如果要允许关闭行的最后一条记录而不使用
      结尾,只需将模式修改为:

      awk -F, '{print $2}' RS='\\[|\\],?|\\],\\[' file
      

      这使得记录分隔符末尾的逗号是可选的。

      此grep行应该可以:

      grep -oP '[^,]*(?=])'
      
      简而言之,这一行提取
      ]
      之间的文本,这是您想要的内容。

      sed

      sed 's/\[[^,]\+,\([^]]\+\)\]/\1/g; s/,/\n/g'
      

      第一个正则表达式查找:一个文本开括号、一些非逗号字符、一个逗号、捕获括号、一些非闭括号字符、结束捕获和一个文本闭括号。它用捕获的文本替换所有这些内容。然后,用换行符替换剩余的逗号。

      一个
      awk
      备选方案:

      awk '$0~FS{print $1}' RS=',' FS=']' inputfile
      
      RS=”,”
      :将“RecordS分隔符更改为逗号

      FS=']
      :将FieldSeparator设置为
      ]


      $0~FS
      :如果当前记录中存在
      FS
      ,则打印第一个字段(在输出中避免FS)

      您也可以使用sed和coreutils:

      <infile tr -d '][' | tr , '\n' | sed '1d; n; d'
      
      解释
      tr
      删除括号并用换行符替换逗号
      sed
      然后删除第一行以及之后的每一行。

      对于多字符的GNU awk:

      $ awk -v RS='[]],[[\n]' -F, '{print $2}' file
      19.44
      19.44
      19.38
      19.38
      

      将保留最后一个
      ]
      否,两个命令的输出相同,并且都按照预期输出数字-使用问题中的示例数据。抱歉,我没有看到最后一个逗号,我的问题是没有问题。将
      附加到列表中并不少见,这将使writer的实现变得更容易。@JID已经更改了awk命令。现在它解决了您的问题。
      $ awk -v RS='[]],[[\n]' -F, '{print $2}' file
      19.44
      19.44
      19.38
      19.38