Awk

提取以大寫開頭的列,然後提取以小寫開頭的下一列

  • February 6, 2020

我有一個包含多列的文件,由下劃線 (_) 分隔。

大多數列的第一個字元都以大寫字母開頭,有些則以小寫字母開頭。

我打算為每一行提取字元串,它以大寫字母開頭,下一列以小寫字母開頭。每一行都會發生至少一個這樣的情況。(更新:只有第一場比賽會很棒)。棘手的部分是這種情況不會發生在每一行的同一列。

例如:

Today_is_a_Good_Day
It_Doesnt_rain
i_dont_Like_rainy_day

期望的輸出:

Today_is
Doesnt_rain
Like_rainy

有沒有辦法使用 grep/sed/awk 或其他命令進行此類文本提取?

我試圖尋找一些類似的解決方案來解決我的問題,但沒有找到。

更新:至少會有

通過grep具有 PCRE 支持的實現和-o

$ grep -P -o '(?<![^_])\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file
Today_is
Doesnt_rain
Like_rainy

(如果您不支持,您可以替換grep -P為)。pcregrep``grep``-P

那是一個u小寫字母L后跟 0 個或多個非字母_,然後是_一個l大寫字母字母L和另一個由 0 個或多個非字母組成的序列_,整個事情只有在它不跟隨一個非字母的情況下才匹配_(即,跟隨一個_或行首)。

這將在自己的行上列印每個匹配的事件。要將其限制為每行的第一個匹配項,您可以採用不同的方法:

grep -P -o '^(.*?_)??\K\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file

對於每行的最後一場比賽,相同但使用貪婪版本的運算符來吃掉前導部分:

grep -P -o '^(.*_)?\K\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file

引用自:https://unix.stackexchange.com/questions/565930