1

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

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

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

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

ABBBBBBBBB
CCDDDDDDDZ

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

4

2 回答 2

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 的回答

于 2013-07-21T14:43:31.120 回答
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
于 2013-07-21T16:25:09.110 回答