如何在每次出现特定字符之前打印10个字母?

时间:2013-07-21 14:41:17

标签: perl bash grep

使用grep,我可以在文档中打印所有出现的大写字母“Z”。但是,输出将显示文档中每个“Z”的整行。我需要将此限制为仅打印每次出现“Z”之前出现的10个字母。

例如,如果文件中有一行“AAAABBBBBBBBBCCCCCCDDDDDDDZ”,它将打印出“CCDDDDDDD”,即之前出现的10个字母。

  • 如果“Z”之前的字母少于10个,则无需打印任何内容。
  • 如果“Z”在一行中出现多次,则应打印每个“Z”前面的10个字母,例如:“AAAABBBBBBBBBZCCCCCDDDDDDDZ”将打印“ABBBBBBBBB”和“CCDDDDDDDZ”。

结果将是这些字母的输出列表,例如:

ABBBBBBBBB
CCDDDDDDDZ

如何在文档中每次出现字母“Z”之前打印10个字母?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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