ファイルが空白行で終わる場合、sedは挿入できません。

ファイルが空白行で終わる場合、sedは挿入できません。

ファイルがあります。uca.xml(カスタムタスク用のThunarの設定):

<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
</actions>
<--blank line here-->

このファイルを参照してください空行で終わる

ファイルを挿入するbashコマンド/スクリプトが必要です。カスタムタスク.txt含む:

<action>
    <!--custom configuration-->
</action>

すると次のようになります。

<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
<action>
    <!--custom configuration-->
</action>
</actions>

私は与えられた方法を試しましたジェフ・ガニュ:

sed -n -i -e '/<\/actions>/r customAction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml

しかし、ラベルの下に1つ以上の文字(空白行ではない)が挿入されている場合にのみ機能します。

一時的な回避策はスクリプトです。

echo "someDummyText" >> uca.xml
sed -n -i -e '/<\/actions>/r customaction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml
sed -i 's/someDummyText//' uca.xml
sed -i '${/^$/d;}' uca.xml

しかし、私はsedがよりエレガントな一行の解決策を持っていると信じています。よろしくお願いします。

メモ:この記事は私がU&LコミュニティとStackExchangeコミュニティに投稿したものですので、ご了承ください。 SE FAQを読んで他の場所で答えを見つけようとしましたが、運がありませんでした。

ベストアンサー1

あなたの解決策は完全に十分だと思います。最後の2つのsedを1つに置き換えて最適化できます。

sed -i '$d' uca.xml

結局、何を削除するかを知るために、追加の行をそこに入れるだけです。


代替ソリューションを探している場合は、sedを使用してパターンマッチングの行番号を取得し、-1を使用して読み取ることができます。

if lno=$(sed -n -e '/<\/actions>/=' uca.xml)
then let lno=lno-1
     sed  -i -e "$lno"'r customaction.txt' uca.xml
fi

または、古いが便利なコマンドを好む場合は、ed次のことを実行できます。

ed -s uca.xml <<\!
?</actions>
-1r customaction.txt
w
q
!

おすすめ記事