我有一个相当大的 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
没有frompattern
和topattern
有输出:
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
你可以使用其他任何东西来回显文件
例如cat
或echo