
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
第二個輸出比第一個輸出好。還需要一些其他的 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
文件中的內容時很有用。