編集:@john1024の素晴らしい反応の後に次のことができるかどうか疑問に思いました。

編集:@john1024の素晴らしい反応の後に次のことができるかどうか疑問に思いました。

prova.txt次のファイルがあります。

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

extra1
extra2
bla

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

extra2
bla
bla

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

「ここで掻き始め」から最初の空白行に移動する必要があります。出力は次のようになります。

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

ご覧のとおり、「ここでクロール開始」以降の行はランダムであるため、-A -B grepフラグは機能しません。

cat prova.txt | grep "Start to grab from here" -A 15 | grep -B 15 "^$" > output.txt

空の行が表示されるまでクロールされる最初の行(「ここでスクレイピングを開始」など)をキャプチャする方法を見つけるのに役立ちますか? 「ここで掻き始め」の後、どのくらいのランダムな行が発生するかを予測することはできません。

すべてのUNIX準拠のソリューションが高く評価されています(grep、sed、awkはPerlまたは同様のソリューションよりも優れています)。

編集:@john1024の素晴らしい反応の後に次のことができるかどうか疑問に思いました。

1°チャンクソート(ここでインポートした内容に応じて:1、1、2)

2° 4個(ランダムアルファベット順) 行削除 fix1,fix2,fix3,fix4 ただし、常に4個

3°最後にランダムな重複を削除します(例:sort -uコマンド)。

最終出力は次のようになります。

# fix lines removed - match 1 first time
Start to grab from here: 1
random1
random2
random3
random4

#fix lines removed - match 1 second time
Start to grab from here: 1
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

または

# fix lines removed - match 1 first time and the second too
Start to grab from here: 1
random1
random2
random3
random4
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

2番目の出力は最初の出力よりも優れています。いくつかの追加のUnixコマンドの魔法が必要です。

答え1

awkを使う

努力する:

$ awk '/Start to grab/,/^$/' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

/Start to grab/,/^$/範囲を定義します。一致する行で始まり、Start to grab最初の後続の空行で終わります。^$

sedを使う

非常に似たロジックを使用します。

$ sed -n '/Start to grab/,/^$/p' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

-n明示的に要求されない限り、何も印刷しないようにsedに指示します。 /Start to grab/,/^$/pで定義された範囲内のすべての行を印刷するように指示します/Start to grab/,/^$/

答え2

誰かのユースケースに役立つ可能性があるため、代替ソリューションを公開しています。このソリューションは、指定された要件を満たしていません。最良の解決策は@John1024の答えを参照してください。

awkを使用してレコード区切り文字を空の文字列に設定でき、awkはそれを空白の改行として解釈します。

$ awk '/Start/' RS= prova.txt 
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

このバージョンでは、出力中にスペースの改行は保持されません。また、事前一致コンテキストがある場合に表示されます。この動作は、grepがファイル内の何かを探していて、それが属する改行で区切られたブロックを見たい場合に便利です。たとえば、次のようになります。

$ awk '/random1546/' RS= prova.txt 
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

iniたとえば、ファイル内のコンテンツを見つけるときにこれが役に立つことがわかりました。

関連情報