首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用bash解析下面定义的元素

如何使用bash解析下面定义的元素
EN

Stack Overflow用户
提问于 2020-10-12 08:14:38
回答 1查看 35关注 0票数 0

我有这个给定的xml,我只需要更改其中的一个元素,它总是在标题字符串THIS_IS_NEED_TO_CHANGE下,目前我使用sed更改它。

代码语言:javascript
复制
sudo sed -i -E 's/_THIS_IS_NEED_TO_CHANGE_/_NEW_STR_/g' the_file.xml"

但这是错误的,因为"THIS_IS_NEED_TO_CHANGE“可以更改为另一个字符串。

代码语言:javascript
复制
<plist version="1.0">
        <dict>
                <key>items</key>
                <array>
                        <dict>
                                <key>metadata</key>
                                <dict>
                                        <key>bundle-identifier</key>
                                        <string>xxxx</string>
                                        <key>bundle-version</key>
                                        <string>xxxx</string>
                                        <key>kind</key>
                                        <string>software</string>
                                        <key>platform-identifier</key>
                                        <string>xxxxx</string>
                                        <key>title</key>
                                        <string>_THIS_IS_NEED_TO_CHANGE_</string>
                                </dict>
                        </dict>
                </array>
        </dict>
        </plist>

** 更新 **

我不能安装任何其他Linux应用程序

我需要使用默认安装的Linux工具来完成这个任务。

EN

回答 1

Stack Overflow用户

发布于 2020-10-12 11:11:02

在没有任何其他工具的情况下,您可以使用awk将输出重定向到tmp文件,然后将该tmp文件移回原始文件。因此,在示例中使用带有源数据的文件plist:

代码语言:javascript
复制
awk -v yourtext="_NEW_STR3_" -F [\<\>] '/<key>/ { field=$3;print $0 } /<string>/ { if (field=="title") { match($0,$3);printf "%s%s%s\n",substr($0,1,RSTART-1),yourtext,substr($0,RSTART+RLENGTH,length($0)) } } !/<string>/&&!/key>/ {print $0}' plist > plist.tmp && mv -f plist.tmp plist

这将字段分隔符设置为<或>,并将要打印的新内容作为变量yourtext传递。然后,它检查带有和获取内容的行,并将它们放在变量字段中。对于包含的行,如果字段变量先前已设置为title,则将行打印到字符串内容,然后打印新内容(包含在变量“yourtext”中),然后打印行的其余部分。在所有其他情况下,只需按原样打印行即可。

或者,您可以使用sed:

代码语言:javascript
复制
sed -Ei '/<key>title<\/key>/ {n;s/(^.*<string>)(.*)(<\/string>$)/\1_NEW_STR_4\3/g}' plist

搜索行title<\key>,然后移动到下一行,将该行拆分为括号中指定的三个部分。打印第一部分,然后是修改后的文本,然后是最后的第三部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64314035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档