我想提取模式之后的每個單詞,但是,我只能提取與模式在同一行的單詞,如果單詞是在換行符之后出現的,我無法得到它。例如,
Gary is a college student.
Steve and John are college
teachers.
我想提取“學生”和“老師”,但我只得到了“學生”。我的解決方案是
grep -oP '(?<=college )[\w ]*' | sort | uniq
uj5u.com熱心網友回復:
像這樣的工具grep基本上是面向線的。但是, GNU grep 可以-z選擇使用 0 位元組作為分隔符而不是換行符,這樣您就可以將輸入檔案視為單個大“行”:
$ grep -Pzo 'college\s \K\w ' input.txt | tr '\0' '\n'
student
teachers
uj5u.com熱心網友回復:
grep(或者實際上,通常,大多數 Unix 文本處理工具)檢查單行,并且不能跨越行邊界跨越匹配。一個簡單的 awk 腳本可能會起作用:
awk '{ for(i=1; i<NF; i)
if ($i=="college") print $(i 1) }
$NF=="college" { n=1 }
n { print $1; n=0 }' file
您也可以輕松地對其進行重構以計算 Awk 中的命中數,并避免使用管道sort | uniq(或者,更好的是sort -u),但我將其留作練習。學習足夠多的 Awk 來自己撰寫這樣的簡單腳本是值得的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434630.html
上一篇:在PHP中將特定字串轉換為陣列
