특정 태그 세트에 추가해야 하는 XML 파일이 있습니다. 기본적으로 파일 구조는 다음과 같습니다.
<key>servers</key>
<dict>
... Server Details ...
</dict>
다음 줄을 일치시키고 싶습니다.
<key>servers</key>
<dict>
그리고 서버 연결을 지정하는 XML 블록을 추가합니다 <dict>
. 새 XML 청크는 꽤 길기 때문에 자체 텍스트 파일에 넣었습니다.
고민 sed
하고 awk
해봤는데 고민이 되더라구요. 이 작업을 수행하기 위해 Perl을 사용하는 예도 보았지만 perl
Perl에 익숙하지 않습니다. 내가 아는 한, sed
그것은 awk
다중 라인 매칭에 좋지 않습니다.
여러 줄 일치를 수행해야 하는 이유는 이 태그가 XML 파일에서 자주 사용되며 전체 내용을 바꾸는 대신 해당 섹션에 블록을 추가 <dict>
해야 하기 때문입니다 .<key>servers</key>
답변1
다음을 수행할 수 있습니다.
awk '{print}
$0 == "<dict>" && previous == "<key>servers</key>" {
system("cat other-file.xml")
}
{previous = $0}'
답변2
sed '/keys_line_1/,/keys_line_last/{/keys_line_last/{
h;s/unique_split_point.*//;r /path/to/insert/file
x;s/.*unique_split_point//;G
}}'
sed
가정을 조정할 필요가 있을 때 완전히 용서하지는 않습니다. 그것이 하는 모든 일은 sed
방금 한 일의 직접적인 결과이기 때문에 세부적인 부분에서 아주 작은 실수가 결과를 크게 바꿀 수 있습니다.
이런 식으로 스크립트 디버깅은 약간의 광기와 많은 인내심 없이는 sed
실망스러운 일이 될 수 있지만 이러한 특성을 고려하면 보상은 엄청날 수 있습니다. 나높은l
해보신다면 이 과정에서 ook 명령어를 최대한 활용하시는 걸 추천드립니다.
sed ...;l;...complicated_script...;l;...
사실 두 번째로 질문을 보니까 처음에 생각했던 것보다 더 쉬운 것 같아요. 당신이 정말로 필요한 모든 것(제 생각에는)패턴 공간을 한 줄씩 확장하는 것입니다섬기는 사람일관된. 기본적으로 sed
주기당 한 줄만 버퍼링되지만 명령 및 명령은 N
이 P
동작 D
을 직접 제어합니다.
사실 처음에는 질문을 오해했다고 생각합니다. 줄 블록이 아닌 한 줄에 텍스트를 삽입하고 싶다고 생각했습니다.
따라서 다음이 필요할 수 있습니다.
sed '\|<key>servers</key>|,/<dict>/N;P
/\n<dict>/!D;s/.*\n//;r /path/to/file'
이렇게 하면 관심 있는 행을 제외한 모든 행이 범위에 포함됩니다.섬기는 사람당신의사전일치 항목은 가능한 한 빨리 편집 버퍼에서 제거되며 r
첫 번째 파일 이후에만 대상 파일을 출력합니다.사전*서버를 따르며 고유한 포인트인 모든 시퀀스와 일치합니다.문서출력 버퍼에 추가되면 직접 다음을 따르십시오.사전앞에 ewline이 있으면 일치합니다 \n
.
답변3
이런 것이 효과가 있을까요?
sed '\|<key>servers</key>|{n
\|<dict>| r other-file.xml
}' file.xml
답변4
Perl 태그를 추가했기 때문에:
perl -pE 'BEGIN{
$/ = "<key>servers</key>\n<dict>\n";
$content = `cat file.xml`
}
$_.=$content' your_input_file