次のXMLファイルがあります。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:enabled="false" android:orientation="horizontal" android:id="@id/action_container"
android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip"
android:layout_height="48.0dip" android:layout_weight="1.0"
style="@style/Widget.Compat.NotificationActionContainer"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image"
android:layout_width="@dimen/notification_action_icon_size"
android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside"
android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc"
android:ellipsize="end"
android:layout_gravity="start|center"
android:id="@id/action_text" android:paddingLeft="4.0dip"
android:clickable="false" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true" android:alpha="0.5"
style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
余分なスペースと改行を削除しようとしています。
これが私が必要とする結果です。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer" xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="@dimen/notification_action_icon_size" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
このコマンドを試してみました。
sed -i '' 's/^[ \t]*//;s/[ \t]*$//' file.xml
一部のスペースは削除されましたが、改行は削除されませんでした。
最終的に私はID(@id / action_image)だけを知っているので、ImageViewの幅(android:layout_width)を5dipに変更できるようにしたいと思います。
IDでxml要素を取得し、他のパラメータの値を変更できるようにしたいです。
答え1
xmlstarlet
適切なコマンドを使用してくださいfo
。
$ xmlstarlet fo file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="@dimen/notification_action_icon_size" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
インデントを完全に省略するために使用されますxmlstarlet fo -n
。
属性があるノードの属性を変更するためにandroid:layout_width
XML文書の形式を再指定する必要はありません。ImageView
android:id
@id/action_image
$ xmlstarlet ed -u '//ImageView[@android:id="@id/action_image"]/@android:layout_width' -v "5dip" file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="5dip" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
xmlstarlet
ここでは、探しているノードの正しい属性を編集するために使用します。 XPath式を使用した属性の選択
//ImageView[@android:id="@id/action_image"]/@android:layout_width
XPath式でノードを//ImageView
見つけます。ImageView
どこかに文書内で。LinearLayout
最上位ノードの子のみに制限するには、代わりにを使用してください/LinearLayout/ImageView
。
-v "5dip"
このコマンドは、属性に新しい値を提供します。
厳密に言えば、この質問は
IDでXML要素を取得できるようにしたい[...]
つまり、ノード名が不明です。これを行うには、ImageView
XPath式をに変更するだけ*
です。みんなandroid:id
与えられた文字列と一致するノードです。
関連:
- RegExは、XHTML自己埋め込みタグを除くオープンタグと一致します。 (StackOverflowから)
答え2
awk
区切り文字を変更し、2つ以上のスペースを1に切り捨てるために使用されます。
$ awk -v RS="<" -v FS="\n" -v ORS="\n" -v OFS=" " '$0 {$1="<"$1; gsub(/ +/," ",$0); print}' input.xml
答え3
ソリューションには、次のawk
変更が含まれます。layout_width
5dip
awk -v RS='> *\n *' -v ORS='>\n' '/id="@id\/action_image"/{gsub("layout_width=[^ ]*","layout_width=\"5dip\"")}NF=NF' file
この特別なケースでは動作しますが、通常、これらの標準のLinuxツールはxmlファイルを処理するのには適していません。
出力:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer" xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="5dip" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
答え4
次のコマンドを使用して、余分な空白と空白行を削除できます。
sed -r "s/+//g" ファイル名|sed '/^$/d'