使用 sed 从两个已知子字符串之间的大文件中抓取一个部分?

使用 sed 从两个已知子字符串之间的大文件中抓取一个部分?

我有一个相当大的 XML 文件,其中没有换行符。

它太大了,在 Emacs 或其他文本编辑器中打开和操作速度很慢。但我只想提取两个已知子字符串之间的一小段。

我不关心保留 XML 结构,我只想要一块字符。

这应该是 sed 中的一行程序,不是吗?

知道如何做吗?我尝试调整https://stackoverflow.com/questions/13242469/how-to-use-sed-grep-to-extract-text-between-two-words但是当我将文件导入其中时,它似乎不起作用。(它适用于玩具示例,但我想我的文件可能太大了。)

答案1

使用 GNU grep:

frompattern输出内容为topattern

grep -o 'frompattern.*topattern' file.xml

没有frompatterntopattern有输出:

grep -Po 'frompattern\K.*(?=topattern)' file.xml

答案2

嗯,通常用 sed 很容易做到。但用 awk 总是很容易做到:

awk '/frompattern/,/topattern/' your.xml > chunk.xml

这里的两个模式是正则表达式(就像 sed 一样)。如果出于某种原因你不愿意这样做,你可以使用简单的字符串,前提是你知道它们在哪里:

awk '$x=="fromstring",$y=="tostring"' your.xml > chunk.xml

此处 x 和 y 是要作为屏障标志的字符串的字段位置。(只需付出很少的努力,就可以完成更多。)

答案3

我使用一个名为(管道查看器)的命令pv- 安装后,您可以看到命令的进度以及完成所需的时间。非常适合大文件

对于 Mac - (对于其他用户,请转到ostechnix.com

brew install pv

我的示例是使用 sed。


pv bigFile.txt | sed -n '/^FIRST PART OF STRING/,/^LAST PART OF STRING `/p' > output.txt

如果你不使用,pv你可以使用其他任何东西来回显文件

例如catecho

相关内容