我有这个给定的xml,我只需要更改其中的一个元素,它总是在标题字符串THIS_IS_NEED_TO_CHANGE下,目前我使用sed更改它。
sudo sed -i -E 's/_THIS_IS_NEED_TO_CHANGE_/_NEW_STR_/g' the_file.xml"但这是错误的,因为"THIS_IS_NEED_TO_CHANGE“可以更改为另一个字符串。
<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工具来完成这个任务。
发布于 2020-10-12 11:11:02
在没有任何其他工具的情况下,您可以使用awk将输出重定向到tmp文件,然后将该tmp文件移回原始文件。因此,在示例中使用带有源数据的文件plist:
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:
sed -Ei '/<key>title<\/key>/ {n;s/(^.*<string>)(.*)(<\/string>$)/\1_NEW_STR_4\3/g}' plist搜索行title<\key>,然后移动到下一行,将该行拆分为括号中指定的三个部分。打印第一部分,然后是修改后的文本,然后是最后的第三部分。
https://stackoverflow.com/questions/64314035
复制相似问题