使用正则表达式搜索单行文本文件

使用正则表达式搜索单行文本文件

据我所知,所有 UNIX 文本处理实用程序都是一次读取一行并在这一行上执行一个操作。

我有一个巨大的文件,其中只有一行文本,其中包含我关心的几个标记。

您可以将文件的内容视为如下所示: xzxzxzzxzxAxzzBxzxCzxxzxxzxzzxzxzAzBzxxxxzzCzxzxzxzxzxxzz

我想为 A.*B.*C 的每次出现获取 (A 和 B) 和 (B 和 C) 之间的两个字符串。在这个例子中,我想要的输出是这样的:

xzxzx

zxxxxzz

我该怎么做呢?

编辑:抱歉,我没说清楚。 A、B、C 是长字符串,只能通过正则表达式识别。

答案1

我确信使用awkperlsed和其他方法可以得到很多有趣的答案。这是一个相当简单的选项,用于tr将这个问题转回我们知道如何解决的问题——在一行中查找模式:

 $ tr 'C' '\n' <test.file | sed -n 's/.*A\(.*\)B\(.*$\)/\1 \2/p'

tr 'C' '\n'命令将输入​​中的任何“C”转换为换行符。因此,有必要将其通过管道传输到一个命令中,该命令将输出 A 和 B 之间以及 B 和行尾之间的文本。

如果 A、B 和 C 是正则表达式而不是简单字符,请尝试:

sed -e 's/C/\n/g' < test.file | sed -n 's/.*A\(.*\)B\(.*\)/\1 \2/p'

这使用相同的基本思想,但用于sed创建换行符。

答案2

awk概括了要记录的行的概念,可以用任何字符终止。几种实现方式,例如呆呆,支持任意正则表达式作为记录分隔符。未经测试:

gawk -vRS='C' 'sub(/.*A/, "") && sub(/B.*/) {print}'

答案3

如果该行可以装入内存,那么重复使用 Perl 中的 split 函数就可以了。否则,我将按块读取文件(使用 Perl sysread 函数)并按上述方式单独处理每个块 - 允许感兴趣的字符串跨越块边界。

相关内容