如何检索文本的特定部分? - grep/正则表达式

如何检索文本的特定部分? - grep/正则表达式

我需要从文本文件中检索特定信息:

Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE 

要检索的信息:

Java 对象优先

编译器:原理、技术和工具

C# 如何编程

Unix 让一切变得简单:基础知识及其他 (Made Easy)

抛物线问题的 Galerkin 有限元方法

答案1

cut -d , -f 5 FILE

将产生您需要的结果。这将拉出第五列,以逗号分隔符分隔。

答案2

最简单的解决方案,假设数据字段中没有嵌入的逗号或换行符,是使用cut -d , -f 5 file,可能需要进行一些后处理来消除这将留下的初始空白字符(sed 's/^[[:blank:]]*//'将删除这些字符)。

除非您有一个能够理解该选项grep的非标准变体,否则无法提取数据。标准仅提取匹配grep-ogrep线从文件中。

使用正则表达式匹配特定字段非常繁琐,并且通常会导致代码不可读(因此无法维护),一旦发现极端情况就会中断。

在这种情况下,最好使用知道如何将输入划分为单独字段的工具,如上cutawk(下)。如果事实证明您的数据实际上是一个 CSV 文件,您可能需要查看csvkit其实csvcut用程序,因为 CSV 是一种结构化格式,具有特殊的引用和编码规则,诸如 、 、 和 之类的简单工具grepsed难以awk应对。


awk -F ',[[:blank:]]*' '{ print $5 }' file

使用正则表达式指定数据中的分隔符(逗号后跟可选空格)。第五个这样的字段被提取并打印在每行上。

这假设没有字段包含嵌入的逗号(或换行符)。

给定问题中的输入,这将生成

Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems

你也可以sed像这样使用 GNU:

tr ',' '\n' <file | sed '5~9!d; s/^[[:blank:]]*//'

这只是用换行符替换所有逗号,然后打印从第 5 行开始的每第 9 行(实际上删除不是这些行中的每一行,并打印其余行)。 A使用正则表达式在打印之前删除每行开头的初始空白。


只是为了好玩:

由于您实际上想要每行九个字段的中间字段,因此我们可以剥离第一个和最后一个字段,然后重复此操作,直到没有其他字段可以剥离为止。

s/^[^,]*,//可以使用in删除开头的字段sed,可以使用 删除末尾的字段s/,[^,]*$//。如果最近的命令发生了更改,则命令t会分支到给定的标签。该命令引入了一个标签。seds///:

$ sed -e ': again' -e 's/^[^,]*,//; s/,[^,]*$//' -e 't again' -e 's/^[[:blank:]]*//' file
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems

答案3

我假设您的标题后面带有LM....这是适合您的正则表达式:

sed "s/\([^,]*, *\)\{4\}\(.*\), LM.*/\2/" booksdata

数据包含在文件中booksdata。正则表达式\([^,]*, *\)\{4\}捕获 4 个字段实例,,末尾用可选空格分隔。使用LM...允许在书名中包含逗号。

相关内容