据我所知,所有 UNIX 文本处理实用程序都是一次读取一行并在这一行上执行一个操作。
我有一个巨大的文件,其中只有一行文本,其中包含我关心的几个标记。
您可以将文件的内容视为如下所示: xzxzxzzxzxAxzzBxzxCzxxzxxzxzzxzxzAzBzxxxxzzCzxzxzxzxzxxzz
我想为 A.*B.*C 的每次出现获取 (A 和 B) 和 (B 和 C) 之间的两个字符串。在这个例子中,我想要的输出是这样的:
xzxzx
zxxxxzz
我该怎么做呢?
编辑:抱歉,我没说清楚。 A、B、C 是长字符串,只能通过正则表达式识别。
答案1
我确信使用awk
、perl
、sed
和其他方法可以得到很多有趣的答案。这是一个相当简单的选项,用于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
答案3
如果该行可以装入内存,那么重复使用 Perl 中的 split 函数就可以了。否则,我将按块读取文件(使用 Perl sysread 函数)并按上述方式单独处理每个块 - 允许感兴趣的字符串跨越块边界。