ファイルがあります。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>
それの後に追加されます。
このコマンドの作成方法にはa
GNUが必要ですsed
(so gsed
)。