SEDはスペースと改行を削除します。

SEDはスペースと改行を削除します。

次の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_widthXML文書の形式を再指定する必要はありません。ImageViewandroid: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要素を取得できるようにしたい[...]

つまり、ノード名が不明です。これを行うには、ImageViewXPath式をに変更するだけ*です。みんなandroid:id与えられた文字列と一致するノードです。

関連:

答え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_width5dip

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'

関連情報