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.

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

관련 정보