検索して 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

XMLファイルを編集することはsed決して良い考えではありません。 XMLファイルの形式が若干異なると、アプローチは失敗します。

適切なXMLがある場合(とにかく必要だと思います)xmlstarlet

正しいことは、xml少なくとも以下を意味します。

  • androidどこかに宣言された名前空間
  • タグをTextView閉じる(例:使用/>
  • 各タグの属性は一度だけ存在します(あなたの例ではandroid:textColor2回定義され、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"
/>

おすすめ記事