テキストを見つけてコピーしてファイルの次の行に挿入するにはどうすればよいですか?

テキストを見つけてコピーしてファイルの次の行に挿入するにはどうすればよいですか?

.xmlファイルを処理するスクリプトを作成しようとしています。要素を含むすべての行を見つけ<title>てコピーし、見つかった要素の後ろの次の行に貼り付け、要素の種類も変更する必要があります。ここに例があります。

オリジナル:

一部のテキスト
<title>テキスト 1</title>
一部のテキスト
<title>テキスト 2</title>
一部のテキスト

これは私が得なければならないでしょう:

一部のテキスト
<title>テキスト 1</title>
<description>テキスト 1</description>
一部のテキスト
<title>テキスト 2</title>
<description>テキスト 2</description>
一部のテキスト

sedまたはgrep(または他のツール)を使用して実行できますか?

答え1

sed -E 's%<title>(.*)</title>%<title>\1</title>\n<desc>\1</desc>%g' file.xml宿題をしなければなりません。

もう少し説明すると、 -Eパラメータはsed拡張正規表現を使用するように指示するため、引用符を使用できます。通常、sed形式のsedに置き換えられますs/search/replace/g。検索テキストにスラッシュがあるため、sed の%代わりに/sed を使用してその部分を表示するので、検索テキストでスラッシュをバックスラッシュで隠す必要はありません。残りは、検索セクションのコードスニペットを\1参照する置換セクションを含む一般的な正規表現エントリです。(…)

答え2

XMLパーサー/プロセッサは、XMLデータを操作するのに適したツールです。

xmlstarlet解決策:

デモinput.xml内容:

<root>
some text
<title>text 1</title>
some text
<title>text 2</title>
some text </root>

xmlstarlet ed -a '//title' -t elem -n 'description' -v '' input.xml \
 | xmlstarlet ed -u '//description' -x './preceding-sibling::title[1]/text()'

出力:

<?xml version="1.0"?>
<root>
some text
<title>text 1</title><description>text 1</description>
some text
<title>text 2</title><description>text 2</description>
some text </root>

  • ed- 編集モード

  • -a- 追加措置

  • -u- アップデートタスク

関連情報