2013-07-21 94 views
1

使用grep,我可以在文檔中打印所有大寫字母「Z」。但是,輸出將顯示文檔中每個「Z」所在的整個行。我需要限制這一點,只打印出現在每次出現「Z」前的10個字母。例如:如何在每個特定字符出現前打印10個字母?

例如,如果文檔中有一行「AAAABBBBBBBBBCCCCCCDDDDDDDZ」,則會打印出「CCDDDDDDD」,即前面出現的10個字母。

  • 如果在「Z」之前少於10個字母,則不需要打印任何內容。
  • 如果「Z」在單行中出現多次,應打印每個這些「Z」之前的10個字母,例如:「AAAABBBBBBBBBZCCCCCDDDDDDDZ」將打印「ABBBBBBBB」和「CCDDDDDDDZ」。

結果將是這些信件的輸出列表,例如:

ABBBBBBBBB 
CCDDDDDDDZ 

如何打印我的文檔中的字母「Z」的每一個發生前的10個字母?

+1

你有什麼想從'AAAABBBBBBBBBZDDDDDDDZ'獲得? – ikegami

回答

9

簡單:

grep -oP '.{10}(?=Z)' <<< AAAABBBBBBBBBZCCCCCDDDDDDDZ 

說明:

-o  : Print only match, not entire line 
-P  : Use PCRE/Perl regex 
.{10} : Match is any 10 characters, 
(?=z) : which are followed by "Z". (Search for positive look-ahead for more details) 
<<< ...: Here string 

編輯:

注意:這是不行的,如果10個字符,我們希望是重疊的。例如輸入= AAAABBBBBBBBBZDDDDDDDZ。如果輸入包含這樣的模式,看igegami's answer

+0

如果兩個Z在彼此的10個字符之內,則不起作用。 – ikegami

+0

不清楚這是否是一個需求恕我直言。如果是這樣,你的答案正則表達式應該與'grep -oP'一起工作,我想。 – tripleee

+0

不,我的模式只會在'grep -oP'中使用時打印'Z'(如果它工作的話)。 – ikegami

2
$ perl -nE'say for /(?<=(.{10}))Z/g' <<'__EOI__' 
AAAABBBBBBBBBZCCCCCDDDDDDDZ 
AAAABBBBBBBBBZDDDDDDDZ 
__EOI__ 
ABBBBBBBBB 
CCCDDDDDDD 
ABBBBBBBBB 
BBZDDDDDDD 

$ perl -nE'say for /(?=(.{10})Z)/g' <<'__EOI__' 
AAAABBBBBBBBBZCCCCCDDDDDDDZ 
AAAABBBBBBBBBZDDDDDDDZ 
__EOI__ 
ABBBBBBBBB 
CCCDDDDDDD 
ABBBBBBBBB 
BBZDDDDDDD 
+0

+1。我是使用Perl的新手。你能解釋一下代碼嗎?我很驚訝'。{10}'在前瞻/回顧中。 – anishsane

+0

我現在只有一秒,所以我只能解釋爲什麼很快:如果你想重疊匹配,那麼匹配不能消耗字符,所以匹配必須在前瞻/後向。 – ikegami

相關問題