파일이 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
두 번째 표준 입력에 쓰는 첫 번째 스크립트는 다음과 같습니다 sed
.
/<.modelVersion> *$/a\
\ \ \ \ <parent>\
\ \ \ \ \ \ \ \ ...\
\ \ \ \ </parent>
두 번째 항목이 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