Macのsedコマンドを使用して一致後に複数行を挿入する

Macのsedコマンドを使用して一致後に複数行を挿入する

ファイルが2つあります。

XMLファイル

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        ...
    </parent>
</project>

b.xml

<project>
    <modelVersion>4.0.0</modelVersion>
</project>

<parent>...</parent>a.xmlからコピーしてb.xmlの後に入れたいです</modelVersion>

これが私が持っているものです:-

PARENT=`awk '/<parent>/,/<\/parent>/' a.xml | tr '\n' ' '`
sed -i '' "s|</modelVersion>|</modelVersion> ${PARENT}|g" "b.xml"

操作中にエスケープされていない改行に対する不満を避けるために、改行を空白に置き換える必要があるため、フォーマットがややフォーマットされていないようですsed

<project>
  <modelVersion>4.0.0</modelVersion>     <parent>         ...     </parent> 
</project> 

b.xmlを次のように表示するにはどうすればよいですか?

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        ...
    </parent>
</project>

ところで、私はMacを使っています。

ベストアンサー1

これはうまくいきます。私は多くの努力をしました。ただ<parent>...</parent>との最初の発生に影響します</modelVersion> *$。そうでなければ、より簡単にすることができます。また、a場合に備えて追加文字を適切にエスケープします。

sed -e'/^ *<parent>/!d;:n'      \
    -e'$d;N;/\n *<.parent>/!bn' \
    -e's/[\[:space:]]/\\&/g'    \
    -e's|.*\(.\n\)|/<.modelVersion> *$/a\1&|;q' a.xml |
sed -e'1,/<\/modelVersion> *$/{' -f- -e\}       b.xml

sedBSDがstdinを認識するかどうか100%確信できません-。私の記憶が正しいならする-f-ただし、必要に応じてスイッチとパラメータに置き換えることができます-f/dev/fd/0

sed2番目の標準入力に書き込む最初のスクリプトは次のとおりですsed

/<.modelVersion> *$/a\
\ \ \ \ <parent>\
\ \ \ \ \ \ \ \ ...\
\ \ \ \ </parent>

2番目の項目がinputのsed最初の項目と一致すると、次</modelVersion> *$の文字列が追加されます。

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        ...
    </parent>
</project>

おすすめ記事