Awk
提取以大寫開頭的列,然後提取以小寫開頭的下一列
我有一個包含多列的文件,由下劃線 (_) 分隔。
大多數列的第一個字元都以大寫字母開頭,有些則以小寫字母開頭。
我打算為每一行提取字元串,它以大寫字母開頭,下一列以小寫字母開頭。每一行都會發生至少一個這樣的情況。(更新:只有第一場比賽會很棒)。棘手的部分是這種情況不會發生在每一行的同一列。
例如:
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