在两个非静态字符串之间打印文本
Print text between two non-static strings
我想自动执行解析 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>
并将其粘贴到 </datasource>
之后。然后我将使用 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 解析器,即使不是内置的,也不是办法。
我会使用 sed
来提取多行 xml 标签:
orig_datasource=$(sed -n '/<datasource/{: l;N;/<\/datasource>/!bl;p}' your_input_file)
此命令在遇到起始 <datasource
标记后开始聚合行,并在聚合到结束 </datasource>
标记后打印结果。 *
XML 标签将被捕获在一个 orig_datasource
变量中,然后我可以按原样使用和修改它:
modified_datasource=$(echo "$orig_datasource" | sed 's/something/else/');
echo "$orig_datasource
$modified_datasource" > target_file
* :有很多方法可能会失败(即 < datasource>
是一个有效的标签开头, sed
命令不会这样理解),但是因为它看起来就像您正在处理来自 JBoss EAP 或 Wildfly 的配置文件一样,您应该是安全的,因为这些工具在启动时会重新格式化其配置文件。
不过,尽可能使用 XML 解析器比将数据解析为文本更安全、更容易。
我想自动执行解析 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>
并将其粘贴到 </datasource>
之后。然后我将使用 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 解析器,即使不是内置的,也不是办法。
我会使用 sed
来提取多行 xml 标签:
orig_datasource=$(sed -n '/<datasource/{: l;N;/<\/datasource>/!bl;p}' your_input_file)
此命令在遇到起始 <datasource
标记后开始聚合行,并在聚合到结束 </datasource>
标记后打印结果。 *
XML 标签将被捕获在一个 orig_datasource
变量中,然后我可以按原样使用和修改它:
modified_datasource=$(echo "$orig_datasource" | sed 's/something/else/');
echo "$orig_datasource
$modified_datasource" > target_file
* :有很多方法可能会失败(即 < datasource>
是一个有效的标签开头, sed
命令不会这样理解),但是因为它看起来就像您正在处理来自 JBoss EAP 或 Wildfly 的配置文件一样,您应该是安全的,因为这些工具在启动时会重新格式化其配置文件。
不过,尽可能使用 XML 解析器比将数据解析为文本更安全、更容易。