テキストの特定の部分を検索するには? - 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: 基本とそれ以上 (Made Easy)

放物線問題に対するGalerkin有限要素法

答え1

cut -d , -f 5 FILE

必要な結果を生み出します。これにより、カンマ区切り文字で区切られた5番目の列が表示されます。

答え2

データフィールドにカンマや改行文字が含まれていないと仮定する場合、最も簡単な解決策はを使用することです。cut -d , -f 5 fileこの場合、残される最初の空白文字を削除するために少し後処理が必要になる場合があります(sed 's/^[[:blank:]]*//'これらの空白文字は削除されます)。

このオプションを理解するgrep非標準バリアントがないと、データを抽出できません。基準のみ一致項目の抽出grep-ogrepワイヤーファイルから。

特定のフィールドを一致させるために正規表現を使用するのは面倒で、多くの場合、特殊なケースが見つかるとすぐに中断される読み取れない(したがってメンテナンスできない)コードが生成されます。

cutこのような場合は、上下のようにawk入力を別々のフィールドに分割する方法を知るツールを使用することをお勧めします。データが実際にCSVファイルであることがわかったら、ユーティリティを調べてみてくださいcsvkit。 CSVは、などの単純なツールを処理するのが困難な特別なcsvcut引用符とエンコーディング規則を持つ構造化形式であるためです。grepsedawk


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

これ正規表現の使用データの区切り文字を指定します(カンマの後にオプションのスペースが続く)。 5番目のフィールドが抽出され、各行に印刷されます。

これは、挿入されたカンマ(または改行)を含むフィールドがないと仮定します。

問題に入力が与えられると、次のものが生成されます。

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

次のようにGNUを使用することもできますsed

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

これはすべてのカンマを改行文字に置き換え、5行目から始まり9行目に印刷します(実際には削除この行はそれぞれではなく、残りの行を印刷します)。 ㅏ正規表現の使用印刷する前に、各行の先頭から最初のスペースを削除してください。


楽しみとして:

実際には、1行に9つのフィールドで構成される中間フィールドが必要なので、最初と最後のフィールドを削除し、削除するフィールドがなくなるまでこれを繰り返すことができます。

s/^[^,]*,//inを使用して先頭のフィールドを削除し、sedinを使用して最後のフィールドを削除できます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...書籍のタイトルにカンマを許可します。

関連情報