ファイルが空白行で終わる場合、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
!

答え2

sed読み取り()コマンドを使用してくださいr

$ sed '\#</action>#r customAction.txt' uca.txt
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
<action>
    <!--custom configuration-->
</action>
</actions>

入力ファイルの最後には、出力に保持される空行があります。このrコマンドは、与えられたパターンを見つけた後、与えられたファイルの内容を挿入します。文字列は一度だけ表示されるため、これはサンプルデータで期待どおりに機能します</action>。入力ファイルに既存のジョブが追加されている場合、期待どおりに機能しません。

以下は、複数のジョブを含むファイルに適用されます。

gsed -e '\#</actions>#d' -e '$ r customAction.txt' -e '$ a\</actions>' uca.txt

タグが見つかったら削除し、</actions>最後にコンテンツを挿入します。customAction.txtそして</actions>それの後に追加されます。

このコマンドの作成方法にはaGNUが必要ですsed(so gsed)。

関連情報