[英]get the last word in body of text
給定一段文本可以跨越不同數量的行,我需要使用grep , sed或awk解決方案來搜索相同模式的許多文件並獲取正文中的最后一個單詞。
文件可以包含這樣的格式,其中我想要的單詞可以被命名為任何名稱
call function1(input1,
input2, #comment
input3) #comment
returning randomname1,
randomname2,
success3
call function1(input1,
input2,
input3)
returning randomname3,
randomname2,
randomname3
call function1(input1,
input2,
input3)
returning anothername3,
randomname2, anothername3
我需要打印出結果
success3
randomname3
anothername3
另外,我需要一些關於每個的文件名和行信息。
我試過了
pcregrep -M 'function1.*(\s*.*){6}(\w+)$' filename.txt
這太貪婪了,我仍然需要打印出特定的分組值,而不是整個模式。 function1
和我的示例代碼中返回的單詞將始終以此命名,並且可以在我的表達式中進行硬編碼。
最后一個代碼塊
使用awk的記錄分隔符RS
在塊中拆分文件。 記錄將被定義為文本塊,記錄由雙換行符分隔。
記錄由字段組成,每兩個連續字段由空格或單個換行符分隔。
現在我們要做的就是打印每條記錄的最后一個字段,產生以下代碼:
awk 'BEGIN{ FS="[\n\t ]"; RS="\n\n"} { print $NF }' file
說明:
FS
這是字段分隔符,設置為換行符,制表符或空格: [\\n\\t ]
。 RS
這是記錄分隔符,設置為doulbe換行符: \\n\\n
print $NF
這將打印帶有索引NF
的字段$
,這是一個包含字段數的變量。 因此,這將打印最后一個字段。 注意:要捕獲文件應以雙換行結束的所有段落,可以通過使用以下方式預處理文件來輕松實現: $ echo -e '\\n\\n' >> file
。
基於評論的替代解決方案
更優雅的簡單解決方案如下:
awk -v RS='' '{ print $NF }' file
以下awk解決方案如何:
awk 'NF == 0 {if(last) print last; last=""} NF > 0 {last=$NF} END {print last}' file
$NF
獲取最后一個“字”的值,其中NF
代表字段數。 然后, last
變量總是將最后一個單詞存儲在一行上,如果遇到空行則打印它,表示段落的結尾。
匹配function1
條件的新版本。
awk 'NF == 0 {if(last && hasF) print last; last=hasF=""}
NF > 0 {last=$NF; if(/function1/)hasF=1}
END {if(hasF) print last}' filename.txt
這將生成您從發布的輸入文件中顯示的輸出:
$ awk -v RS= '{print $NF}' file
success3
randomname3
anothername3
如果你想像你提到的那樣打印FILENAME和行號,那么這可能就是你想要的:
$ cat tst.awk
NF { nr=NR; last=$NF; next }
{ prt() }
END { prt() }
function prt() { if (nr) print FILENAME, nr, last; nr=0 }
$ awk -f tst.awk file
file 6 success3
file 13 randomname3
file 20 anothername3
如果這不符合您的要求,請編輯您的問題,以提供更清晰,更真實的代表性和准確的樣本輸入和預期輸出。
這是Shellfish的awk解決方案的perl版本(加上關鍵字):
perl -00 -nE '/function1/ and /returning/ and say ((split)[-1])' file
或者,有一個正則表達式:
perl -00 -nE '/^(?=.*function1)(?=.*returning).*?(\S+)\s*$/s and say $1' file
但關鍵是-00
選項,它一次讀取一個段落的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.