セクションから始めるにはGrepのサポートが必要です


8

コードのセクションをgrepするテキストファイルがいくつかあります。私が達成しようとしている目標は、特定の行からビューを開始し、その下にあるものをすべて読み取ることができるようにすることです。例えば。以下のテキストで、黄色の開始点でテキストファイルを表示するにはどうすればよいですか。「黄色」の内容と、その内容に関係なく、その下のすべてを表示したいと思います。

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough

回答:


9

AWKの 使用AWK-取得できるので、これが最も簡単です。

awk '/yellow/,0' textfile.txt

サンプル実行

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

グレップ

オプションを使用grepして--after-context、一致後に特定の行数を印刷することもできます

grep 'yellow' --after-context=999999  textfile.txt

コンテキストの自動設定には、を使用できます$(wc -l textfile.txt)。基本的な考え方は、一致として非常に最初の行があり、その一致の後にすべてを印刷したい場合、ファイルの行数から1を引いた数を知る必要があるということです。幸い、--after-context数のエラーはスローされません行なので、完全に範囲外の番号を与えることができますが、それがわからない場合は、行の合計数で十分です

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

コマンドを短くしたい場合--after-contextは、-Aおよびと同じオプション$(wc -l textfile.txt)で、行数とファイル名の順に展開されます。つまり、textfile.txt一度入力するだけで

grep "yellow" -A $(wc -l textfile.txt)

パイソン

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

または、printableフラグなし

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()

grepコマンドをに簡略化できgrep "yellow" -A $(wc -l textfile.txt)ます。
バイトコマンダー

@ByteCommander yup、同様に行うことができます。わかりやすくするためにフルオプションを使用しました
セルギーコロディアズニー2016年

1
@ByteCommanderなんて素敵なハック。残念ながら、ファイル名にスペースが含まれていないためにのみ機能します。
kasperd

@kasperdああ、そうだね。その場合、Sergの元のコマンドにフォールバックする必要がありますgrep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt"
バイトコマンダー


5

ではありませんgrepが、以下を使用していsedます。

sed -n '/^yellow$/,$p' file
  • -n:印刷を禁止します
  • /^yellow$/,$:完全に一致する行の最初の発生からyellow最後の行までのアドレス範囲
  • p:アドレス範囲の行を出力します
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

パーティーに遅れる:)

使用grep

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P Perl互換の正規表現を使用できるようにします

  • -z 入力ファイルを改行ではなくASCII NULで区切る

  • -o 必要な部分だけを取る

  • (?s)DOTALL修飾子であり、トークン.(任意の文字)を使用して改行を照合できます

  • で、改行\n\K\n一致し、一致を\K破棄します

  • yellow\n.*マッチのyellow後に改行が続き、その後もすべて選択され、出力に表示されます。

例:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

少しを使用してpython

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines ファイルのすべての行を含むリストです(末尾の改行も含む)。

  • lines.index('yellow\n')見つかったlines場所の最も低いインデックスを提供しyellow\nます

  • lines[lines.index('yellow\n'):]リストスライシングを使用して、最初からyellow\n最後までの部分を取得します

  • join リストの要素を結合して文字列として出力します


いいですが、Pythonコードは「黄色」に等しい行全体のみを検出することを言及する必要があります。たとえば、「より黄色」のような行は検出されません。
バイトコマンダー

OPの例から@ByteCommander私は、彼らがちょうど一致させたいというその明らかだと思うyellowが一致しない場合はline..alsoでは、我々は変更する必要があるpython1のアルゴ...
heemayl

ええ、確かに。とにかくそれは批判ではなく、答えを改善するためのヒントにすぎません。これを読んでいる他の誰かは、コードが同じようgrepに機能し、完全な行だけに一致しないと想定するかもしれません。ところで賛成しました。
バイトコマンダー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.