3

嗨,下面是我的文本文件

{"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

请建议我

谢谢

4

4 回答 4

3

我将避免任何复杂的解决方案,而是依赖旧的好 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. 删除"}标志
于 2013-11-11T14:13:12.150 回答
3

GNU

sed -r '/title.*java/I!d;s/.*:.(.*).}$/\1/' file
java烹饪书.pdf
Java书.pdf
于 2013-06-13T12:39:53.920 回答
2

你可以尝试这样的事情awk

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

解释:

  • -F:将字段分隔符设置为:
  • $1~/title检查第一列在哪里title
  • tolower($2)~/java/java不区分大小写地检查第二列
  • gsub(..)是删除"
  • print $2打印第二列
于 2013-06-13T12:09:46.800 回答
0

您绝对应该使用 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 以及为什么不应该这样做它:正则表达式匹配打开的标签,XHTML 自包含标签除外

于 2013-06-13T12:23:37.333 回答