簡體   English   中英

得到文本正文中的最后一個單詞

[英]get the last word in body of text

給定一段文本可以跨越不同數量的行,我需要使用解決方案來搜索相同模式的許多文件並獲取正文中的最后一個單詞。

文件可以包含這樣的格式,其中我想要的單詞可以被命名為任何名稱

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和我的示例代碼中返回的單詞將始終以此命名,並且可以在我的表達式中進行硬編碼。

最后一個代碼塊

使用的記錄分隔符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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM