grep/pcregrep/sed/awk最后一次匹配到文件末尾后的数据

Pum*_*use 3 regex bash awk grep sed

我需要在ENTRY的最后一个匹配到文件末尾之后抓取内容,我似乎无法做到.它可以是多行,数据可以包含文件末尾的任何字符,包括(,\n,).

我试过了:

tail -1 file # doesn’t work due to it not consistently being one line
grep "^(.*"  # only grabs one line
pcregrep -M  '\n(.*' file # I think a variation of this is the solution, but I’ve had no luck so far.  
Run Code Online (Sandbox Code Playgroud)

文件增长如下:

TOP OF FILE                
%
ENTRY
(S®s
?6ûí?‹ôTìßÅDPˆ¬k·Ù"=ÓxF)*†‰ú?ÃQ´¿J‘\˜©ŒG»‡?QÆ’<?sµ-ù±ñ?NäAOilWçk
N+P}V<ôÒ??µ?W*`Hß”;–GØ»14?åR"ºã
FD‘mÍõ?*ÊÎÉC)(S®s
?6ûí?‹ôTìßÅDPˆ¬k·Ù"=ÓxF)*†‰ú?ÃQ´¿J‘\˜©ŒG»‡?QÆ’<?sµ-ù±ñ?NäAOilWçk
N+P}V<ôÒ??µ?W*`Hß”;–GØ»14?åR"ºã
FD‘mÍõ?*ÊÎÉC)eq  
{
DATA
}
ENTRY
(A® S\kÉ?ã1»Âb?¯Ú??ä?HZ@F?§•Ã*‹¡‹…ÿPkJòÑíòú?¶à?¨¢v|u«Ùbó–Ö¶¢?5?Ü@¨•?®@W´?‡*`H?”?–Só¬<?ìEçöf??Gg±:œe™??å)A®  S\kÉ?ã1»Âb?¯Ú??ä?HZ@F?§•Ã*‹¡‹…ÿPkJòÑíòú?¶à?¨¢v|u«Ùbó–Ö¶¢?5?Ü@¨•?®@W´?‡*`H?”?–Só¬<?ìEçöf??Gg±:œe™??å)eq  
{
DATA
}if
ENTRY
(ÌSYõ?9°\K¬???|”/í÷L
Ö?h/ÜÇi"û£?±€ÀNéÓ›bÏÿmâ[?4J’XPü´Z
oÜlø?…qìõ¢,ßü©cÓ{—˜e&ÚÀÓHÏÜ‚m(Œ??ˆQ?òêpoÉÄÂ(S‘E ? !ŸQ§ô6ÉH
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 5

$ awk '/^[(]/{s="";} {s=s"\n"$0;} END{print substr(s,2);}' file
(ÌSYõ?9°\K¬???|”/í÷L
Ö?h/ÜÇi"û£?±€ÀNéÓ›bÏÿmâ[?4J’XPü´Z
oÜlø?…qìõ¢,ßü©cÓ{—˜e&ÚÀÓHÏÜ‚m(Œ??ˆQ?òêpoÉÄÂ(S‘E ? !ŸQ§ô6ÉH
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

awk隐式循环遍历文件.此脚本存储我们要在变量中打印的内容s.

  • /^[(]/{s="";}

    每当我们找到一个以...开头的行时(,我们就会设置s为空字符串.

    这样做的目的是在最后一次出现的行之前删除所有内容(.

  • s=s"\n"$0

    我们将当前行添加到末尾s.

  • END{print substr(s,2);}

    在我们到达文件末尾之后,我们打印s(省略第一个字符,它将是一个多余的换行符).