我需要使用 sed 执行搜索和替换。例如从此示例文本开始:
<TextView
android:textSize="20.0sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:layout_gravity="center"
android:textColor="@android:color/white"
我想用 替换所有出现的android:textColor="@android:color/white"
地方android:textColor="#ffff5d"
我花了 3 个多小时(是的,太令人沮丧了),但没有成功,我越接近
sed -i "s/"$android:textColor=\"@android:color/white\""\|"$android:textColor=\"#ff4000\""/g" path to file.xml
但这是错误的。结果是
androidwhite"|:textColor="#ff4000"/white"
我究竟做错了什么?
答案1
使用sed
编辑 XML 文件几乎从来都不是一个好主意。如果 XML 文件的格式略有不同,您的方法就会失败。
如果您有适当的 XML(我猜您无论如何都需要它),您可以使用 XML 工具,例如xmlstarlet
.
正确的xml
手段,你至少拥有:
android
某处声明的命名空间- 标签
TextView
关闭(例如使用/>
) - 每个标签的属性仅存在一次(在您的示例中,
android:textColor
定义了两次,这使得 XML 无效)。
由于您没有提供 XML 文档的完整示例,因此我将其设置为最低限度有效,如下所示:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:textSize="20.0sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:layout_gravity="center"
/>
现在您可以使用xmlstarlet
:
xmlstarlet ed -P -S \
-N android="http://schemas.android.com/apk/res/android" \
-u "//TextView/@android:textColor" \
-v "#ffff5d" \
file.xml
输出:
<?xml version="1.0"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:textSize="20.0sp"
android:textStyle="bold"
android:textColor="#ffff5d"
android:layout_gravity="center"
/>
答案2
对于我有限的使用
sed 's|android:textColor="@android:color/white"|android:textColor="#ffff5d"|g'
工作正常。我只是在手机上编辑了一些apk,所以我什至不知道xmlstarlet
ARM 64 android 是否存在二进制文件。