给出以下输入:
<start>
<header>
This is header section
</header>
<body>
<body_start>
This is body section
<a>
<b>
<c>
<st>111</st>
</c>
<d>
<st>blank</st>
</d>
</b>
</a>
</body_start>
<body_section>
This is body section
<a>
<b>
<c>
<st>5</st>
</c>
<d>
<st>666</st>
</d>
</b>
<b>
<c>
<st>154</st>
</c>
<d>
<st>1457954</st>
</d>
</b>
<b>
<c>
<st>845034</st>
</c>
<d>
<st>blank</st>
</d>
</b>
</a>
</body_section>
</body>
</start>
我想执行以下解析。
如果标签st
的值为,则需要删除整个标签。请注意,文件中可能存在或不存在值 154。c
154
<b>
</b>
因此,如果存在值 154,则需要删除以下部分:
<b>
<c>
<st>154</st>
</c>
<d>
<st>1457954</st>
</d>
</b>
我想在 shell 脚本中编写代码。但我无法使用,xslt
因为我的系统不支持它。
答案1
您可以使用pup
,用于处理 HTML 的命令行工具。对于 XML,您可以使用xpup
。
例如,要查找要移除的部件,请运行:
$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
<c>
<st>
154
</st>
</c>
<d>
<st>
1457954
</st>
</d>
</b>
sed
要使用(file.html
您的 HTML 文件在哪里)从输入中删除此部分,请运行:
sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")
笔记:
- 我们用来
xargs <file.html | tr -d " "
将文件压平为一行而没有空格。 - 我们使用提到的
pup
命令来找到要删除的模式。 - 我们使用
sed
以下方式删除模式:sed "s@PATTERN@@g" <(input)
。 - 要就地替换(通过修改文件),
-i
对于 GNU添加sed
,或者-i'.bak'
对于 BSD添加sed
。
为了更容易理解,可以使用以下脚本:
function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input
注意:上述方法的缺点是所有空格都被删除,包括内容中的空格。为了改善这种情况,需要使用其他扁平化输入的方法。
因此xargs | tr -d " "
,可以使用 或 来sed
代替。ex
paste
以下是使用的示例ex
:
ex +%j +"s/[><]\zs //g" +%p -scq! file.html
以下是带 shell 功能的版本(可以替代以前的版本):
function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }