Awk
我可以從這些數據中提取第 n 個“塊”嗎?
我有
stdout
很多看起來像這樣的文本塊:% QUESTION Who played drums for The Beatles? % QUESTION Who played guitar for The Beatles? % QUESTION Who played bass for The Beatles ?
這裡的想法是將文件分成“塊”,每個塊都以行開頭
% QUESTION
。我想編寫一個腳本來列印該數據的第 n 塊。例如,發行
nthchunk 3
應該列印Who played bass for The Beatles ?
我怎麼能這樣做呢?
使用
awk
支持正則表達式作為記錄分隔符 (RS
) 的實現,例如 GNUawk
,您可以執行以下操作:awk -v n=3 -v RS='(\n+|^)% QUESTION\n' 'NR == n+1 {print; exit}' < questions.txt
GNU sed
採用擴展的正則表達式模式-E
將用於解決這個問題。基本思想是在模式空間中累積連續的 % 問題行和其間的行。而計數器作為一串點保存在保持空間中。chunk=2 sed -E ':loop /%/,/%/N /%.*%/!{ /%/!d;$!bloop s/$/\nfiller/ } G;s/$/./ /\n[.]{'"${chunk}"'}$/bend h;s/.*\n//;x s/.*(\n.*)\n.*$/\1/;D :end s/^[^\n]*\n+(\S.*\S)(\n.*){2}$/\1/ q ' file
或者,在 slurp 模式下 perl 將 FS 設置為問題行。數組@F 的元素應該是塊。
perl \ -F'/(?:^|\n+)\%\h+QUESTION\n+/' \ -pals -0777 \ -e '$_=$F[$n]' \ -- -n="${chunk}" ./file;
輸出:
Who played guitar for The Beatles?