【问题标题】:how to extract text which matches particular fields in text file using linux commands如何使用linux命令提取与文本文件中特定字段匹配的文本
【发布时间】:2013-06-13 12:04:11
【问题描述】:

您好,下面是我的文本文件

{"Author":"john"
  "subject":"java"
  "title":"java cook book.pdf"}

{"title":"Php book.pdf"
 "Author":"Smith"
 "subject":"PHP"}

{"Author":"Smith"
"title":"Java book.pdf"}

从上面的数据中我想提取所有包含“java”字的标题,我应该得到以下输出

java cook book.pdf
Java book.pdf

请给我建议

谢谢

【问题讨论】:

  • 你知道 JSON 是什么吗?

标签: linux sed awk


【解决方案1】:

GNU

sed -r '/title.*java/I!d;s/.*:.(.*).}$/\1/' file
java烹饪书.pdf Java书.pdf

【讨论】:

    【解决方案2】:

    我会避免任何复杂的解决方案,而是依赖旧的好 grep+awk+tr:

    $ grep '"title":' test.txt | grep '[Jj]ava' | awk -F: '{print $2}' | tr -d [\"}]
    java cook book.pdf
    Java book.pdf
    

    其工作原理如下:

    1. 提取所有包含"title":的行
    2. 从这些行中提取所有包含Javajava
    3. : 分割这些行并显示第二个字段
    4. 删除"} 标志

    【讨论】:

      【解决方案3】:

      你可以用awk试试这样的东西:

      awk -F: '$1~/title/&&tolower($2)~/java/{gsub(/\"/,"",$2);print $2}' file
      

      说明:

      • -F: 将字段分隔符设置为 :
      • $1~/title 检查第一列在哪里 title
      • tolower($2)~/java/ 检查第二列 java 不区分大小写
      • gsub(..) 是删除"
      • print $2 打印您的第二列

      【讨论】:

      • 感谢您的回复,请您解释一下命令,以便我可以尝试其他文件
      • @user2353439 添加了说明。
      【解决方案4】:

      您绝对应该使用 json 解析器来获得完美的结果。我喜欢 PHP 提供的解析器,如果您的文件如图所示,是一堆用空行分隔的 json 块:

      foreach( explode("\n\n", file_get_contents('/your/file.json_blocks')) as $js_block ):
          $json = json_decode( trim($js_block) );
          if ( isset( $json['title'] ) && $json['title'] && stripos($json['title'], 'java') ):
              echo trim($json['title']), PHP_EOL;
          endif;
      endforeach;
      

      这将比使用任何给定的 sed/awk/grep/ 等组合更可靠,因为 json 遵循特定格式并且应该与解析器。例如,“标题”中的一个简单的新行对 json 没有实际意义,但会破坏 Jaypal 提供的解决方案。请参阅此以解决类似问题:使用正则表达式解析 xhtml 以及为什么不应该这样做它:RegEx match open tags except XHTML self-contained tags

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 2017-10-28
        • 2015-06-14
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2018-12-14
        • 2012-07-01
        相关资源
        最近更新 更多