ファイルが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
sed
BSDがstdinを認識するかどうか100%確信できません-
。私の記憶が正しいならする-f-
ただし、必要に応じてスイッチとパラメータに置き換えることができます-f/dev/fd/0
。
sed
2番目の標準入力に書き込む最初のスクリプトは次のとおりですsed
。
/<.modelVersion> *$/a\
\ \ \ \ <parent>\
\ \ \ \ \ \ \ \ ...\
\ \ \ \ </parent>
2番目の項目がinputのsed
最初の項目と一致すると、次</modelVersion> *$
の文字列が追加されます。
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
...
</parent>
</project>
答え2
試してみてくださいawk
awk '/parent/,/\/parent/{s=s"\n"$0}/\/modelVersion/{$0=$0s}NR!=FNR' a.xml b.xml
またはsed
一時ファイルを使用してください
sed -n '/parent/,/\/parent/w part
1!{
/^.project/,${
/\/modelVersion/r part
p
}
}' a.xml b.xml
予約が可能な場合があります
sed -n '/parent/,/\/parent/H
1!{
/^.project/,${
/\/modelVersion/{
G
s/\n//
}
p
}
}' a.xml b.xml