【问题标题】:Print text between two non-static strings在两个非静态字符串之间打印文本
【发布时间】:2017-09-25 12:53:47
【问题描述】:

我想自动化一个解析 XML 文件并复制其中一部分的脚本。 我搜索了found a way to do that,但它只适用于像

这样的字段
<title> .... </title>

我的目标是复制这个

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    THINGS AND FIELDS IN HERE
</datasource>

并将其粘贴到 &lt;/datasource&gt; 之后。然后我将使用 sed 更改值。但我基本上想把那部分加倍。

我只是不知道该怎么做,也许这是一个 XY 问题。有什么帮助吗?

示例:

我有

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
THINGS AND FIELDS IN HERE

我想拥有

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    THINGS AND FIELDS IN HERE
</datasource>

<datasource enabled="true" jndi-name="java:/MODIFIED_NAME_HERE_PostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    MODIFIED THINGS AND FIELDS IN HERE
</datasource>

重要提示:我需要避免在机器上安装新软件(明确的客户要求)。 XML 解析器,如果不是内置的,也不是办法。

【问题讨论】:

  • 使用 xml 解析器
  • 我应该指定它,我会修改帖子...必须避免在机器上安装软件(客户要求)
  • 我会修改问题
  • 因为看起来你正在从 Wildfly 或 JBoss EAP 解析一个standalone/domain.xml,你实际上在不使用 XML 解析器的情况下非常安全,因为这些工具在启动时会重新格式化它们的配置。不过,解析文本仍然比直接解析 XML 要麻烦得多。
  • 本机软件不包含xsltproc?这是一个非常广泛/标准的工具。与带有ElementTree 标准库模块的Python 相同。因此,我对您的目标机器上没有 XML 解析器的说法持怀疑态度。

标签: xml bash parsing centos7


【解决方案1】:

我会使用sed 来提取多行 xml 标签:

orig_datasource=$(sed -n '/<datasource/{: l;N;/<\/datasource>/!bl;p}' your_input_file)

此命令在遇到开始的&lt;datasource 标记后开始聚合行,并在聚合到结束&lt;/datasource&gt; 标记后打印结果。 *

XML 标记将在 orig_datasource 变量中捕获,然后我可以按原样使用和修改:

modified_datasource=$(echo "$orig_datasource" | sed 's/something/else/');
echo "$orig_datasource

$modified_datasource" > target_file

* :它可能会失败的方式有很多(即&lt; datasource&gt; 是一个有效的标签开头,sed 命令不会这样理解),但是因为看起来你正在处理来自 JBoss EAP 或 Wildfly 的配置文件你应该是安全的,因为这些工具在启动时会重新格式化它们的配置文件。 尽管如此,尽可能使用 XML 解析器比将数据解析为文本更安全、更容易。

【讨论】:

  • 实际上该命令只是将整个文件存储在 $orig_datasource...(是的,我使用的是 Wildfly8.1)
  • @WyattGillette 我已经修复了 sed 命令中的一个错误,你能再试一次吗?
  • 是的,这几乎可以工作了!它还会找到重复项,所以我必须找到一种方法让它在第一次 结束比赛后停止……最好的方法是什么?……但这是向前迈出的一大步! (只是为了理解......错误是什么?)编辑:很简单,在'p'之后添加了'q' :) Upvote被授予并且thnx很多!
  • 错误是我写了“当你遇到结束标签时,打印你的保持缓冲区的内容,然后无论如何跳转到聚合循环的开头”。这意味着在成功打印数据源后,随后的所有内容也会被聚合,就好像它在数据源标签内一样。现在我改为写“只要你没有遇到结束标签继续聚合,然后(否则)打印你聚合的内容”,它在数据源标签的末尾正确退出循环。
  • 阿门。而已。泰
猜你喜欢
  • 1970-01-01
  • 2021-03-23
  • 2016-10-21
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2020-08-08
  • 2019-01-24
相关资源
最近更新 更多