搜索并替换为 sed 特殊字符

搜索并替换为 sed 特殊字符

我需要使用 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,所以我什至不知道xmlstarletARM 64 android 是否存在二进制文件。

相关内容