shell Bash -在XML中的匹配项之后/之前插入一行

k0pti3hp  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(115)

我在XML中有这一行

<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">

我想在“〈应用程序”后面插入下面一行

android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true"

最终输出如下所示

<application android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">

我尝试了下面的sed命令,它没有做任何事情。

sed -i '/<application>/a\ android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" ' filename.xml

尝试了下面的,它添加了所需的行在下一行。但我想有后,立即申请。

sed -i '/<application/a android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true"' filename.xml
nzk0hqpo

nzk0hqpo1#

搜索<application>时找不到匹配的<application key=value>

解决眼前的问题:为什么a没有追加一行?

将代码更改为搜索<application[ >],这将不再是一个问题:

fragment='<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">'

sed -e '/<application[ >]/a\ android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true"' <<<"$fragment"

......正确地(只要问题是a操作没有触发和追加行)发出:

<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">
 android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true"

但是,这并不能保证生成一个有效的XML文档,使用sed编辑XML是天生的、无法修复的错误,任何人都不应该这样做。

言归正传:在现有行上添加属性

如果您的真实的目标不是在元素后面追加一行,而是在现有元素中 * 添加属性 *,那么更接近于纠正的内容(在使用结构未知工具编辑结构化数据的固有的、不可避免的不可靠性范围内)可能如下所示:

sed -re 's!<application([> ])!<application android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true"\1!'

相关问题